Di recente, mi è capitata l'esigenza di manipolare i dati (proprietà) di un oggetto custom, utilizzando la classe System.Xml.Serialization, senza l'ausilio del "classico" FileStream (e relativo file xml generato), ma operando direttamente in memoria.
Ho pensato di scrivere due righe in merito dato che gli esempi di questi tipo non sono numerosi.
Serializzazione XML
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
MemoryStream ms=new MemoryStream
sr.Serialize(ms,myobject);
In questo caso, la firma del metodo Serialize della classe XmlSerializer, accetta uno stream generico (in memoria nel ns caso) come primo parametro, e l'oggetto che si desidera persistere come secondo...
Deserializzazione XML
Se volessi deserializzare il contenuto di prima...
ms.Position = 0;
myobject=(MyOBject)serializer.Deserialize(ms);
oppure partendo da una stringa xml...
byte[] buffer =Encoding.ASCII.GetBytes(StringaXML);
MemoryStream ms=new MemoryStream(buffer);
myobject=(MyObject)serializer.Deserialize(ms);
Ho voluto mostrare i due casi per evidenziare l'importanza dell'operazione ms.Position = 0; che resetta la posizione iniziale dello stream in memoria, in modo che l'oggetto Serializer legga correttamente la sequenza di byte, evitando cosi il fastidioso errore: The root element is missing che avviene proprio quando lo stream (es: subito dopo aver serializzato un oggetto) non è posizionato correttamente.
Nel secondo caso invece, viene più chiaramente mostrato come è possibile creare un'istanza di tipo Memory Stream a partire da un array di byte, caricato grazie all'opportuno metodo GetBytes della proprietà statica ASCII della classe Encoding, che restituisce il buffer di byte prendendo in input una stringa Xml proveniente da un file, o in alternativa da un campo text del database.
Ovviamente, in entrambi i casi sarà necessario inserire nella firma del metodo Deserialize lo stream in memoria, e castare con il tipo dell'oggetto in memoria il risultato dell'operazione di deserializzazione.