Lo script di oggi propone un metodo per la clonazione di un'istanza, esigenza necessaria soprattutto in applicazioni WinForms quando si vuole permettere la modifica di un'entità ed eventualmente farne il rollback ripristinando quella originale. Sebbene il .NET Framework disponga dell'interfaccia ICloneable e del relativo metodo Clone per raggiungere questo scopo, non tutte le classi però la implementano e non tutte nello stesso modo, poiché spesso si ottiene una copia della classe stessa, ma non anche ricorsivamente per tutte le istanze a cui la classe fa riferimento.
Per avere un completa copia è possibile sfruttare la runtime serialization che permette, con le sue due implementazioni BinaryFormatter e SoapFormatter, di persistere un grafo di oggetti in uno Stream o di caricare un grafo di oggetti da uno Stream. L'idea è quindi quella di usare un MemoryStream per salvare e subito dopo ricaricare il grafo di oggetti:
object myObj = "test"; using (MemoryStream stream = new MemoryStream()) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, myObj); // Porto il cursore all'inizio stream.Position = 0; object myObjCopy = formatter.Deserialize(stream); }
Questa tecnica, utilizzata anche dal motore di Windows Workflow Foundation, è abbastanza semplice e ha come unico requisito quello che tutti i tipi presenti nel grafo siano serializzabili. Devono quindi essere marcati con l'attributo SerializableAttribute o implementare ISerializable. Qualora non sia possibile intervenire su alcune classi (per esempio di terze parti), attraverso la proprietà SurrogateSelector del formatter si è in grado di indicare per ogni tipo il modo in cui questo dev'essere serializzato.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.