Lavorando ad un progetto che utilizza BizTalk mi sono trovato spesso a lavorare con messaggi XML ed ho avuto quindi la necessità di effettuare serializzazione e deserializzazione dei messaggi direttamente in memoria senza passare per file XML.
Per quanto riguarda la deserializzazione è abbastanza semplice visto che mi arriva il messaggio già all'interno di un XmlDocument è sufficiente utilizzare il metodo Deserialize della classe XmlSerializer:
private MyClass MyClassDeserialize(XmlDocument xmlMyClass)
{
XmlSerializer serialize = new XmlSerializer(typeof(MyClass));
XmlNodeReader nr = new XmlNodeReader(xmlMyClass);
return (MyClass)serialize.Deserialize(nr);
}
Per la serializzazione il discorso è invece un po' più complesso in quanto la serializzazione deve avvenire in memoria così come la creazione dell'XmlDocument.
Ho pensato di effettuare la serializzazione della classe all'interno di un MemoryStream, copiare il contenuto del MemoryStream in un array di byte e trasformare questo array di byte in un Xml tramite il metodo GetString della classe ASCIIEncoding.
Sembra un po' macchinoso ma funziona correttamente e mantiene delle performance discrete.
private XmlDocument MyClassSerialize(MyClass myC)
{
// istanzia il serializzatore
XmlSerializer serialize = new XmlSerializer(typeof(MyClass));
// istanzia l'xmldocument che verrà restituito
XmlDocument xmlMyClass = new XmlDocument();
// istanzia il memory-stream in cui deserializzare l'xml
using( MemoryStream ms = new MemoryStream() )
{
// deserializza la classe all'interno del memory stream
serialize.Serialize(ms, myC);
ms.Position = 0;
// instanzia un array di byte per copiare il contenuto del memorystream
byte[] b = new byte[ms.Length];
ms.Read(b, 0, (int)ms.Length);
}
// carica nel xmldocument il contenuto dell'array di byte
xmlMyClass.LoadXml(Encoding.ASCII.GetString(b));
return xmlMyClass;
}
Technorati Tags:
XML,
.NET