Gioco un po’ quello che c’e’ in System.Xml.Serialization, anche perchè in TV non c’e’ (al solito) nulla di umano da vedere... ed il resto (saggio) della famiglia dorme.
La classe per serializzare è XmlSerializer, che si avvale di una bella dose di attributi sulle proprietà delle classi , es.
XmlRootAttribute : elemento radice dell’oggetto
XmlElementAttribute = elemento xml classico
XmlAttributeAttribute= elemento di tipo attributo
E i suoi amici.. XmlTextAttribute, XmlTypeAttribute, XmlEnumAttribute.., XmlArray
(ci sono anche per soap e si chiamano SoapAttributeAttribute, SoapEnumAttribute....).
[XmlRootAttribute("IlMioOggetto", Namespace = "http://www.bruna.com", IsNullable = false)]
public class mioOggetto2
{
[XmlAttributeAttribute]
public string id;
[XmlElementAttribute( IsNullable = false, DataType="string" )]
public string nome; //se sono private non si serializzano
[XmlElementAttribute] //è cmq il default
public string cognome;
[XmlElementAttribute(ElementName="Eta", DataType="int")]
public int eta;
[XmlArray]
public List<string> nipotini;
public mioOggetto2()
{
// questo è necessario perchè altrimenti XmlSerializer si rifiuto di inizializarsi
}
public mioOggetto2(string n, string c, int e)
{
id = System.Guid.NewGuid().ToString();
nome = n;
nipotini = new List<string>();
eta = e;
}
public void addNipote(string nome) { nipotini.Add(nome); }
}
E si utilizza in un bel xmlSerializer
static void Main(string[] args)
{
mioOggetto2 obj1 = new mioOggetto2("Donald", "Duck");
obj1.addNipote("Qui"); obj1.addNipote("Quo"); obj1.addNipote("Qua");
XmlSerializer ser = new XmlSerializer(typeof(mioOggetto2));
TextWriter txtW = new StreamWriter("c:\\temp\\serialize1.xml");
ser.Serialize(txtW, obj1);
txtW.Close();
}
Ed il risultato è:
<?xml version="1.0" encoding="utf-8" ?>
- <IlMioOggetto xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="43e35b0b-e94f-47f7-a2eb-9e4db3c682e1" xmlns="http://www.bruna.com">
<nome>Donald</nome>
<Eta>0</Eta>
- <nipotini>
<string>Qui</string>
<string>Quo</string>
<string>Qua</string>
</nipotini>
</IlMioOggetto>
E per rileggere? Nel main:
XmlSerializer ser2 = new XmlSerializer(typeof(mioOggetto2));
TextReader txtR = new StreamReader("c:\\temp\\serialize1.xml");
mioOggetto2 m = (mioOggetto2) ser2.Deserialize(txtR);
E avro’ tutto a posto..
Un esempio molto bello, c’e’ nell’MSDN in c++ , nella classe XmlSerializer.