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:
Posta un commento