Skip to content

Instantly share code, notes, and snippets.

@ChrisMoney
Last active September 21, 2016 17:36
Show Gist options
  • Save ChrisMoney/0baff9f5dc1fa757d9b3a2d648287b17 to your computer and use it in GitHub Desktop.
Save ChrisMoney/0baff9f5dc1fa757d9b3a2d648287b17 to your computer and use it in GitHub Desktop.
XML Serializer - Deserializer. No XSD involved.
protected override void WriteRequest(object data, Stream stream)
{
var serializer = SerializerHelper.Get(data.GetType());
var ns = new XmlSerializerNamespaces(new[] { new XmlQualifiedName("", "") }); //strip all default namespaces.
var settings = new XmlWriterSettings { Encoding = new UTF8Encoding(false), OmitXmlDeclaration = false };
using (var xw = XmlTextWriter.Create(stream, settings))
{
if (settings.OmitXmlDeclaration)
{
//'encoding' in the xml declaration used to be forced to all-caps. As far as I can tell, there's no reason for it.
xw.WriteRaw("<?xml version=\"1.0\" encoding=\"UTF-8\">");
}
serializer.Serialize(xw, data, ns);
xw.WriteRaw("<EOF>");
}
}
protected override T ReadResponse<T>(Stream stream)
{
XmlTextReader reader = null;
//Note: XmlTextReader likes to dispose the stream, so make sure you don't need it anymore. (Logs still work though)
// Also, I'm not 100% sure XmlTextReader needs to be disposed at all if the base stream is handled elsewhere.
// Probably need to look into it.
try
{
reader = new XmlTextReader(stream);
reader.MoveToContent();
XmlReader sub = reader.ReadSubtree(); //Read just the root element, not the subsequent <EOF>
XmlSerializer serializer = SerializerHelper.Get(typeof(T));
return (T) serializer.Deserialize(sub);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment