Nello script #492 abbiamo visto come creare un clone di un oggetto utilizzando la libreria JSON.NET. In questo script vedremo come effettuare la stessa operazione sfruttando le classi native presenti sia nel .NET Framework che nel .NET Core: MemoryStream e BinaryFormatter. BinaryFormatter si occupa di deserializzare l'oggetto nel MemoryStream e di serializzarlo successivamente in un nuovo oggetto. MemoryStream è uno storage temporaneo per la classe deserializzata.
Per poter sfruttare questa tecnica l'unica accortezza da avere è quella di marcare la classe da clonare con l'attributo Serializable. Se la classe a sua volta contiene membri il cu tipo è un'alatra classe, anche questa deve essere marcata con l'attributo Serializable. Inoltre, dobbiamo tener presente che questa tecnica non serializza le proprietà, ma i campi che rappresentano il vero stato di una classe.
Vediamo ora il codice.
public static T Clone<T>(this T source) { if (!typeof(T).IsSerializable) { throw new ArgumentException("Parameter is not serializable", "source"); } var formatter = new BinaryFormatter(); using (var stream = new MemoryStream()) { formatter.Serialize(stream, source); stream.Seek(0, SeekOrigin.Begin); return (T)formatter.Deserialize(stream); } }
Il primo blocco verifica che l'oggetto sia serializzabile (cioè marcato con l'attributo Serializable) e in casi negativo lancia un'eccezione. Successivamente istanziamo il BinaryFormatter e il MemoryStream all'interno del quale serializziamo l'oggetto da clonare col metodo Serialize di BinaryFormatter.
Successivamente, riportiamo il cursore dello stream all'inizio col metodo Seek e infine deserializziamo lo stream in un nuovo oggetto col metodo Deserialize del formatter.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare ChatGPT con Azure OpenAI
Definire lo stile CSS in base alle dimensioni del container
Sfruttare il portale Azure per creare script di automazione
Montare blob e file share su Azure App Service
Accesso sicuro ai secrets attraverso i file in Azure Container Apps
Organizzare il codice JavaScript utilizzando i moduli
Intercettare gli eventi di creazione degli oggetti con Entity Framework 7
Limitare lo spazio dei repository di Azure Container Registry con uno script bash e Azure CLI
Utilizzare l'attributo autofill del CSS
Semplificare il deployment di siti statici con Azure Static Web App
Reactive form tipizzati con modellazione del FormBuilder in Angular
Migrare un repository che contiene large file storage objects in GitHub
I più letti di oggi
- Creare dei grafici con OWC
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Prima beta pubblica per il SP1 del .NET Framework 3.5 e VS 2008
- Speciale ADO.NET: accesso ai dati con il .NET Framework
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Utilizzare la direttiva ngSrc di AngularJS per ottimizzare il caricamento delle immagini
- Utilizzare i collapse di Bootstrap 4
- Caricare i dati di configurazione allo startup di un'applicazione Angular