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
Configurare e gestire sidecar container in Azure App Service
Utilizzare il metodo ExceptBy per eseguire operazione di sottrazione tra liste
Utilizzare WebJobs su Linux con Azure App Service
Migliorare l'organizzazione delle risorse con Azure Policy
Path addizionali per gli asset in ASP.NET Core MVC
Simulare Azure Cosmos DB in locale con Docker
Gestione CSS in Blazor con .NET 9
Recuperare le subissue e il loro stato di completamento in GitHub
Utilizzare i variable font nel CSS
Ridurre il reflow ottimizzando il CSS
Utilizzare WhenEach per processare i risultati di una lista di task
Fornire parametri ad un Web component HTML
I più letti di oggi
- Analizzare il contenuto di una issue con GitHub Models e AI
- Integrare OpenAI tramite Aspire
- Interagire con Azure DevOps tramite MCP Server
- Usare la libreria PredicateBuilder per eseguire query tramite Entity Framework che usano or su più campi
- .NET Conference Italia 2025 - Milano
- The Agentic Day - Milano
- Documentare i servizi REST con Swagger e OpenAPI con .NET 9