I recently wanted to use XmlSerialization for bi-directional conversion of data, but unfortunately when trying to then xPath the serialised data I hit a minor stumbling block.
StringBuilder sb = new StringBuilder();
StringWriter writer = new StringWriter(sb);
XmlSerializer serializer = new XmlSerializer(...);
serializer.Serialize(writer, ...);
//OK This sucks. Default XML serialization is UTF-16!!!!
However with a small re-write
//First write to a MemoryStream using an expandable buffer
MemoryStream outStream = new MemoryStream();
using(StreamWriter writer = new StreamWriter(outStream,Encoding.UTF8))
{
XmlSerializer serializer = new XmlSerializer(typeof(Envelope), GetTypes());
serializer.Serialize(writer, envelope);
}
outStream.Close();
//Then read in from a new memoryStream using the same buffer, because we had to close the last one.
MemoryStream inStream = new MemoryStream(outStream.GetBuffer());
StreamReader sr = new StreamReader(inStream);
string xml = sr.ReadToEnd();
//and convert to doc
_document = new XmlDocument();
_document.LoadXml(xml);