[C#] – Serializzare una classe

Quello che andrò ad illustrare oggi è un processo molto utile che consente di memorizzare facilmente degli oggetti su un supporto fisico, quindi diamo prima un pò di teoria e successivamente passiamo ad un progetto di esempio (il codice lo potrete scaricare in fondo all’articolo).
Definizione: In informatica, la serializzazione è 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.

Cosa realizzeremo: Quello che andremo a realizzare consta di un progettino scritto in C# con Visual Studio 2005, il quale non fa altro che salvare una classe in formato XML, e quello che faremo sarà man mano aggiungere carne al fuoco. Alla fine il file che andremo a scrivere sarà il seguente:


Il gatto con gli stivali
9788817001625
Perrault Charles
50
Il gatto con gli stivali2
97888170016252
Perrault Charles2
502

La Classe

Quindi vedremo anche come avere una struttura con possibilità di espandersi dinamicamente.
Il framework .NET ci mette a disposizione delle facility niente male, purchè si ragioni correttamente ad oggetti, quindi iniziamo con il creare una classe che rappresenti quello che vogliamo creare.


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; }
}
}
}

La parolina magica che ci consete di effettuare la serializzazione della classe è [Serializable]; il comportamento è veramente semplice: tutto quello che è public viene salvato, tutto quello che è private no, se voglio evitare di salvare una qualsiasi direttiva public allora userò la parolina magica [XmlIgnore]. Una cosa importante riguarda la root e gli attributi: se dichiarate [XmlRoot(“elenco_libri”)] qualsiasi [XmlAttribute] mettiate nella classe con la stessa visibilità della radice si riferirà ad essa! per avere diversi attributi assegnati a diverse radici dovete definire altre classi con nuove radici ed all’interno altri attributi, ora non vi rimane che studiare il codice poco sopra.

Scrittura di un file serializzato


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 = "Il gatto con gli stivali";
libro1.autore = "Perrault Charles";
libro1.isbn = "9788817001625";
libro1.numero_pagine = "50";

libro libro2 = new libro();
libro2.id = "0001";
libro2.titolo = "Il gatto con gli stivali2";
libro2.autore = "Perrault Charles2";
libro2.isbn = "97888170016252";
libro2.numero_pagine = "502";

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


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);
}
}
}
}

Domande

– Perchè in fase di lettura ho dichiarato un hard cast verso il tipo libro?

Scarica il progetto di esempio

Commenti

commenti

Lascia un commento