Il .NET framework mette a disposizione delle nuove incredibili funzionalità che ci permettono di rendere persistente una nostra classe e poterla trasportare tramite cavo o salvarla su disco.
Questo meccanismo prende il nome di serializzazione ed è lo stesso sfruttato dai web services, per definizione è un processo per salvare un oggetto in un supporto di memorizzazione lineare (un file o un’area di memoria), e/o per trasmetterlo su una connessione di rete.
Lo scopo della serializzazione è di trasmettere l’intero stato dell’oggetto in modo che esso possa essere successivamente ricreato nello stesso identico stato dal processo inverso, chiamato deserializzazione.
Vi sono due modi per serializzare una classe. Usare XmlSerializer (namespace System.Xml.Serialization) o usare i formatters, classi che implementano l'interfaccia IRemotingFormatter (namespace System.Runtime.Remoting.Messaging).
Partiremo dal primo esempio usando XML, alla fine il file che andremo ascrivere sarà il seguente :
<?xml version="1.0"?>
<elenco_libri xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<libri>
<libro id="0000">
<titolo>La storia infinita</titolo>
<isbn>97888188881625</isbn>
<autore>Autore_Storia1</autore>
<numero_pagine>50</numero_pagine>
</libro>
<libro id="0001">
<titolo>La storia infinita2</titolo>
<isbn>97888177776252</isbn>
<autore>Autore_Storia2</autore>
<numero_pagine>512</numero_pagine>
</libro>
</libri>
</elenco_libri>
La Classe
Scriviamo una classe che conterrà le nostre informazioni.
L'attributo Serializable è indispensabile per rendere la nostra classe serializzabile. I membri referenziati devono presentare questo attributo.
L'attributo NonSerialized, applicabile solo a campi, indica che quel membro che non andrà serializzato.
Una cosa importante riguarda la root e gli attributi: se dichiarate [XmlRoot("elenco_libri")].
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
using System.Collections;
namespace xmlSerializer
{
[XmlRoot("elenco_libri")]
[Serializable]
public class elenco_libri
{
// il costruttore vuoto deve essere lasciato così per via della serializzazione
public elenco_libri()
{
}
private ArrayList _elenco = new ArrayList();
[XmlArray("libri"), XmlArrayItem(typeof(libro))]
public ArrayList elenco
{
get { return this._elenco; }
set { this._elenco = value; }
}
}
public class libro
{
private string _id;
private string _titolo;
private string _isbn;
private string _autore;
private string _numero_pagine;
[XmlAttribute]
public string id
{
get { return this._id; }
set { this._id = value; }
}
public string titolo
{
get { return this._titolo; }
set { this._titolo = value; }
}
public string isbn
{
get { return this._isbn; }
set { this._isbn = value; }
}
public string autore
{
get { return this._autore; }
set { this._autore = value; }
}
public string numero_pagine
{
get { return this._numero_pagine; }
set { this._numero_pagine = value; }
}
}
}
Scrittura di un file serializzato
Ora scriveremo il codice per la scrittura di un file serializzato del tipo sopra:
string FILENAME = "elenco_libri.xml";
elenco_libri libri = new elenco_libri();
ArrayList lista_libri = new ArrayList();
libro libro1 = new libro();
libro1.id = "0000";
libro1.titolo = "La storia Infinita";
libro1.autore = "Autore_Storia";
libro1.isbn = "97888188881625";
libro1.numero_pagine = "50";
libro libro2 = new libro();
libro2.id = "0001";
libro2.titolo = "La storia Infinita2";
libro2.autore = "Autore_Storia2";
libro2.isbn = "97888177776252";
libro2.numero_pagine = "512";
libri.elenco.Add(libro1);
libri.elenco.Add(libro2);
System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(typeof(elenco_libri));
using (Stream strm = File.Open(FILENAME, FileMode.Create, FileAccess.Write))
{
xs.Serialize(strm, libri);
}
Lettura di un file serializzato
Ora scriveremo il codice per la lettura del file:
elenco_libri libri = new elenco_libri();
string FILENAME = "elenco_libri.xml";
if (File.Exists(FILENAME) == true)
{
System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(typeof(elenco_libri));
using (Stream strm = File.Open(FILENAME, FileMode.Open))
{
if (strm.Length > 0)
{
try
{
//valorizzo l'oggetto con le proprietà lette dal file
libri = (elenco_libri)xs.Deserialize(strm);
libro libro = (libro)libri.elenco[0];
MessageBox.Show(libro.titolo);
}
catch (System.Xml.XmlException ex)
{
MessageBox.Show(ex.Message);
}
catch (System.InvalidOperationException ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
Scarica esempio codice