Come lavorare con la serializzazione in .Net

Quando si lavora con le applicazioni, è spesso necessario archiviare i dati in un supporto di archiviazione persistente o non persistente in modo che gli stessi dati possano essere recuperati in un secondo momento. La serializzazione, una funzionalità fornita da CLR, può aiutarti a raggiungere questo obiettivo.

La serializzazione può essere definita come il processo di conversione di un oggetto in un flusso di byte, persistendo lo stato dell'oggetto nella memoria, database di un file. Il contrario della serializzazione è la deserializzazione, che ricostruisce l'oggetto dal flusso di byte. In altre parole, la deserializzazione è il processo di conversione di un oggetto serializzato nel suo stato originale.

La serializzazione è necessaria per far passare un oggetto sul filo: facilita la trasmissione di un oggetto su una rete. Pertanto, è possibile sfruttare la serializzazione per passare un oggetto da un dominio dell'applicazione a un altro. Puoi anche sfruttare la serializzazione per creare un clone di un oggetto.

Tuttavia, la serializzazione è anche costosa a causa del sovraccarico delle risorse coinvolto nella serializzazione e de-serializzazione degli oggetti. Per lavorare con la serializzazione in .Net dovresti sfruttare lo spazio dei nomi System.Runtime.Serialization, ovvero dovresti includere questo spazio dei nomi nel tuo programma.

È possibile rendere serializzabile una classe utilizzando l'attributo [Serializable]. Ecco un esempio che mostra come applicare questo attributo a una classe.

[Serializable]

public class Product

{

   public int productCode;

   public string productName;

}

Ora, se desideri limitare la serializzazione di uno o più membri di una classe, puoi utilizzare l'attributo NonSerialized come mostrato nello snippet di codice riportato di seguito.

[Serializable]

    public class Product

    {

        public int productCode;

        public string productName;

        [NonSerialized()]

        public double productPrice;

    }

Il framework .Net fornisce supporto per i seguenti tipi di serializzazione.

  1. Binario
  2. SAPONE
  3. XML
  4. Personalizzato

Serializzazione binaria

La serializzazione binaria è la più veloce di tutte le tecniche di serializzazione: può essere utilizzata per serializzare un oggetto in un flusso binario. È un tipo di serializzazione che può essere utilizzato per serializzare un oggetto in un flusso di output preservando l'identità dell'oggetto: le informazioni sul tipo non vengono perse nel processo di serializzazione. Si noti che quando si utilizza la serializzazione binaria, l'oggetto viene salvato nella sua interezza. Per lavorare con la serializzazione binaria, è necessario includere lo spazio dei nomi System.Runtime.Serialization.Formatters.Binary.

Serializzazione SOAP

La serializzazione SOAP (Simple Object Access Protocol) è una buona scelta quando si desidera trasferire oggetti da un'applicazione a un'altra quando queste applicazioni utilizzano architetture eterogenee. In sostanza, il vantaggio principale dell'utilizzo della serializzazione SOAP è la portabilità. La serializzazione SOAP può essere utilizzata per serializzare un oggetto in formato SOAP. Per lavorare con la serializzazione SOAP è necessario includere lo spazio dei nomi System.Runtime.Serialization.Formatters.Soap nel programma. Si noti che, come la serializzazione XML, gli oggetti serializzati utilizzando la serializzazione SOAP vengono mantenuti come XML.

Serializzazione XML

La serializzazione XML è un tipo di serializzazione utilizzato per serializzare i membri pubblici di un'istanza di una classe in un flusso XML. Si noti che la serializzazione XML è lenta rispetto alla serializzazione binaria, in realtà è molto più lenta. Il vantaggio principale della serializzazione XML è che fornisce supporto multipiattaforma e poiché è basato su testo, è leggibile e può anche essere modificato. È possibile sfruttare XmlAttribute e impostarlo su una proprietà per abilitare la serializzazione della proprietà tramite la serializzazione XML. Il frammento di codice seguente illustra come usare XmlAttribute su una proprietà.

[XmlAttribute("productName")]

public string ProductName

{

  get

  {

    return productName;

  }

  set

  {

    productName = value;

  }

}

Per serializzare e deserializzare un oggetto utilizzando la serializzazione XML è possibile utilizzare XmlSerializer. Il frammento di codice seguente mostra come serializzare un oggetto usando la serializzazione XML: nota come viene usato XmlSerializer.

XmlSerializer xmlSerializer = new XmlSerializer(typeof(Product));

using (TextWriter textWriter = new StreamWriter(@"D:\Product.xml"))

 {

    xmlSerializer.Serialize(textWriter, productObject);

 }

Serializzazione personalizzata

Puoi sfruttare la serializzazione personalizzata per controllare come un'istanza di un tipo può essere serializzata e deserializzata. È possibile implementare la serializzazione personalizzata implementando l'interfaccia ISerializable. L'interfaccia ISerializable dichiara il metodo GetObjectData (). Il frammento di codice seguente illustra come implementare la tecnica di serializzazione personalizzata implementando l'interfaccia ISerializable.

[Serializable]

public class Product : ISerializable

{

    public void GetObjectData(SerializationInfo info, StreamingContext context)

    {

        //Usual code

    }

}