VB.NET: “Deep Copy” e “Shallow Copy”

Quando vogliamo ottenere la copia di un oggetto, abbiamo a disposizione due modalità:

  • Shallow Copy
  • Deep Copy

Shallow Copy

La copia Shallow (lett. superficiale), consente di ottenere una copia dell’oggetto di partenza con la copia delle proprietà di tipo Value; tuttavia le proprietà di tipo Reference puntano ancora agli stessi oggetti puntati dalle corrispondenti proprietà dell’oggetto sorgente della copia.

Deep Copy

La copia Deep (lett. profonda) invece consente di ottenere una copia nel senso più pieno del termine, quindi anche per le proprietà di tipo Reference verranno creati dei nuovi oggetti che conterranno gli stessi “valori” degli oggetti di partenza, ma saranno separati da questi.

Uno dei metodi più immediati per ottenere una Deep Copy consiste nel serializzare l’oggetto in memoria e poi de-serializzarlo nuovamente nel nuovo ogggetto “clone”. Prerequisito fondamentale, ovviamente, è che l’oggetto da copiare sia serializzabile.

Imports System.IO
Imports System.Runtime.Serialization
Imports System.Runtime.Serialization.Formatters.Binary

Namespace tmSoft.ObjectUtils

  Public Shared Function DeepClone(source As Object) As Object

    ' dalla System.Runtime.Serialization.Formatters.Binary
    Dim binaryFormatter As BinaryFormatter

    ' dalla System.IO
    Dim memStream As MemoryStream = New MemoryStream()

    binaryFormatter = New BinaryFormatter(Nothing,
                          New StreamingContext(StreamingContextStates.Clone))

    binaryFormatter.Serialize(memStream, source)

    memStream.Seek(0, SeekOrigin.Begin)

    return binaryFormatter.Deserialize(memStream)

  End Function

End Namespace

A questo punto non resta che richiamare il metodo dalla classe che si vuole clonare; una buona pratica può essere quella di realizzare un’interfaccia (ICloneable, per esempio):

Public Interface ICloneable

  Public Function DeepClone(source as Object) As Object

End Interface

E quindi implementare l’interfaccia nella classe da clonare:

Public Class MyDeeplyCloneable

  Implements ICloneable

  Public Function DeepClone(source as Object) As Object

    Return tmSoft.ObjectUtils.DeepClone(Me)

  End Function

End Class

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*