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
Eliminare spazio inutilizzato in un Azure Container Registry
Accedere alla console di una Azure Container App
Eseguire chiamate hedging gRPC con ASP.NET Core 6
Gestire gli errori di caricamento delle immagini
Utilizzare la libreria EntityFrameworkCore.Exceptions per gestire le eccezioni di Entity Framework Core in modo tipizzato
Creare una timeline da una pipeline di Azure DevOps
Effettuare un deployment differenziale con una GitHub Action
Terraform, Kuberntes e AWS EKS
Chiamare un endpoint ASP.NET Core protetto da Certificate Authentication
Eseguire uno scroll all'interno di una pagina Blazor
Esecuzione a matrici nei workflow di GitHub Action
Continuous Deployment tramite GitOps
I più letti di oggi
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Gestire il breaking change di Entity Framework Core 7 con tabelle che usano identity e trigger
- Raggruppare i parametri di una minimal API in un singolo oggetto in ASP.NET Core
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Speciale Visual Studio 2013 e .NET Framework 4.5.1: One ASP.NET, Windows 8.1, Entity Framework 6