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