domenica 14 ottobre 2007

Serializzazione e Deserializzazione con C# e VB.NET

La serializzazione è l'operazione di generazione di uno stream  (MemoryStream) contenente una immagine in bytes della classe serializzata.
Lo stream può essere utilizzato successivamente per la scrittura di un file fisico o per la trasmissione in rete.
La Deserializzazione è l'operazione contraria, partendo da un backup della classe serializzata si ottiene uno stream contenente l'immagine della classe e da questo la classe stessa.
La classe da serializzare deve essere decorata con l'attributo "Serializable"

C#
[Serializable]

VB.NET
<Serializable()>

Di seguito la classe C# che verrà serializzata, la corrispondente classe VBNET si può trovare nell'esempio allegato

/*
 
* Creato da SharpDevelop.
 * Utente: Luciano
 * Data: 14/10/2007
 * Ora: 13.45
 *
 */

using System;
using System.Runtime;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
using System.Drawing;
using System.IO;

namespace SerializeCs
{

       /// <summary>
       /// Esempio di serializzazione
       /// Definizione una classe "Serializza"
       /// Si decora la classe l'attributo [Serializable] (obbligatorio per i nostri scopi)
       /// </summary>

       [Serializable]
       public class Serializza
       {
             // definizione membri privati
             private int mIntero;
             private string mTesto;
             private DateTime mDataOra;
             private decimal mDecimale;
             private bool mBooleano;
             private Image mImmagine;           

             public Serializza()
             {
             }

             #region Proprietà
             public int Intero
             {
                    get
                    {
                          return mIntero;
                    }
                    set
                    {
                          mIntero = value;
                    }
             }
             public string Testo
             {
                    get
                    {
                          return mTesto;
                    }
                    set
                    {
                          mTesto = value;
                    }
             }
              public DateTime DataOra
             {
                    get
                    {
                          return mDataOra;
                    }
                    set
                    {
                          mDataOra = value;
                    }
             }
             public decimal Decimale
             {
                    get
                    {
                          return mDecimale;
                    }
                    set
                    {
                          mDecimale = value;
                    }
             }
             public bool Booleano
             {
                    get
                    {
                          return mBooleano;
                    }
                    set
                    {
                          mBooleano = value;
                    }
             }
             public Image Immagine
             {
                    get
                    {
                          return mImmagine;
                    }
                    set
                    {
                          mImmagine = value;
                    }
             }
             #endregion
             #region Metodi serializzazione
             /// <summary>
             /// Serializzazione della classe Serializza
             /// </summary>
             /// <param name="serData">Classe da serializzare</param>
             /// <param name="NomeFile">Nome del file da generare</param>
             /// <returns>Operazione Eseguita/Non eseguita</returns>
             public bool Serializzazione(Serializza serData,string NomeFile)
             {
                    bool RetValue = true;
                    MemoryStream ms = new MemoryStream();
                    BinaryFormatter br = new BinaryFormatter();
                    using (FileStream fs = new FileStream(NomeFile, FileMode.OpenOrCreate))
                    {
                          try
                          {
                                 // il metodo Serialize di BinaryFormatter
                                 // restituisce nella variabile ms (MemoryStream)
                                 // la classe serializzata
                                 br.Serialize(ms,serData);
                                 // scriviamo sul file (FileStream fs)
                                 ms.WriteTo(fs);
                          }
                          catch (Exception ex)
                          {
                                 System.Diagnostics.Debug.WriteLine(ex.Message);
                                 System.Diagnostics.Debug.WriteLine(ex.StackTrace);
                                 RetValue = false;
                          }
                          finally
                          {
                                 fs.Close();
                          }                      

                    }
                    return RetValue;
             }

             /// <summary>
             /// Deserializzazione per la classe Serializza
             /// </summary>
             /// <param name="NomeFile"></param>
             /// <returns></returns>
             public Serializza DeSerializzazione(string NomeFile)
             {
                    using (FileStream fs = new FileStream(NomeFile, FileMode.Open))
                    {
                          BinaryFormatter bf = new BinaryFormatter();
                          try
                          {
                                 fs.Seek(0, SeekOrigin.Begin);
                                 return (Serializza) bf.Deserialize(fs);
                          }
                          catch
                          {
                                 return null;
                          }
                          finally
                          {
                                 fs.Close();
                          }
                    }
             }
             #endregion
       }
}

Ho messo alcuni tipi di oggetti nella classe "Serializza" per far vedere che la serializzazione "funziona".
BinaryFormatter Classe del framework che materialmente serializza o deserializza
FileStream Classe del framework dedicata alla generazione del flusso di dati in input o in output

Progetto di Esempio realizzato con C#
Progetto di esempio realizzato con VB.NET

Nessun commento: