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
Utilizzo di CSS Scroll Snap per realizzare un carousel
Ottimizzare la content-visibility in CSS specificando lo spazio da occupato dall'area non renderizzata
Importare un servizio esterno in .NET Aspire
Utilizzare Containers in .NET Aspire
Abilitare il rolling update su Azure Functions flex consumption
Utilizzare Locust con Azure Load Testing
Autenticazione di git tramite Microsoft Entra ID in Azure DevOps
Blazor e Static Web Assets in .NET 10
Raggruppare risorse in .NET Aspire
Filtrare i dati in ASP.NET Core usando OpenTelemetry su Azure Monitor
Utilizzare i command service nei test con .NET Aspire
Self-healing degli unit test con Copilot in GitHub
I più letti di oggi
- Microsoft Visual Studio Code: un nuovo editor gratuito per Windows, MacOSX e Linux per sviluppatori ASP.NET e Node.js
- Costruire servizi basati su XML: SOAP
- Usare le transazioni in applicazioni ASP 1/2
- Security in ASP.NET MVC 5 con ASP.NET Identity 2
- Le novità di ASP.NET 4.0: dall'estendibilità ad ASP.NET AJAX e MVC 2
- Un primo sguardo a Microsoft Velocity
- Gli application pool di IIS 6
- Disponibile la beta 1 del .NET Framework 4.0 e di Visual Studio 2010
- Tutto per portarsi ASP.NET 4.0, Silverlight 4.0 e .NET Framework 4.0 sotto l'ombrellone
- Ecco la roadmap di ASP.NET 5: il rilascio definitivo nel corso del primo trimestre 2016




