<PackageReference Include="Castle.Core" Version="3.0.0.2001" />

DefaultXmlSerializer

using System; using System.Text; using System.Xml; using System.Xml.Serialization; using System.Xml.XPath; namespace Castle.Components.DictionaryAdapter { public class DefaultXmlSerializer : IXPathSerializer { public static readonly DefaultXmlSerializer Instance = new DefaultXmlSerializer(); private DefaultXmlSerializer() { } public bool WriteObject(XPathResult result, XPathNavigator node, object value) { StringBuilder stringBuilder = new StringBuilder(); XmlWriterSettings xmlWriterSettings = new XmlWriterSettings(); xmlWriterSettings.OmitXmlDeclaration = true; xmlWriterSettings.Indent = false; XmlWriterSettings settings = xmlWriterSettings; using (XmlWriter xmlWriter = XmlWriter.Create(stringBuilder, settings)) { if (value is IXmlSerializable) SerializeCustom(xmlWriter, result, node, (IXmlSerializable)value); else Serialize(xmlWriter, result, node, value); xmlWriter.Flush(); } node.ReplaceSelf(stringBuilder.ToString()); return true; } public bool ReadObject(XPathResult result, XPathNavigator node, out object value) { using (XmlReader xmlReader = node.ReadSubtree()) { xmlReader.MoveToContent(); if (typeof(IXmlSerializable).IsAssignableFrom(result.Type)) value = DeserializeCustom(xmlReader, result, node); else value = Deserialize(xmlReader, result, node); } return value != null; } private static void Serialize(XmlWriter writer, XPathResult result, XPathNavigator node, object value) { XmlSerializerNamespaces xmlSerializerNamespaces = new XmlSerializerNamespaces(); xmlSerializerNamespaces.Add(string.Empty, string.Empty); if (!string.IsNullOrEmpty(node.NamespaceURI)) { string prefix = result.Context.AddNamespace(node.NamespaceURI); xmlSerializerNamespaces.Add(prefix, node.NamespaceURI); } XmlRootAttribute xmlRootAttribute = new XmlRootAttribute(node.LocalName); xmlRootAttribute.Namespace = node.NamespaceURI; XmlRootAttribute root = xmlRootAttribute; XmlSerializer xmlSerializer = new XmlSerializer(result.Type, root); xmlSerializer.Serialize(writer, value, xmlSerializerNamespaces); } private static object Deserialize(XmlReader reader, XPathResult result, XPathNavigator node) { XmlRootAttribute xmlRootAttribute = new XmlRootAttribute(node.LocalName); xmlRootAttribute.Namespace = node.NamespaceURI; XmlRootAttribute root = xmlRootAttribute; XmlSerializer xmlSerializer = new XmlSerializer(result.Type, root); reader.MoveToContent(); if (xmlSerializer.CanDeserialize(reader)) return xmlSerializer.Deserialize(reader); return null; } private static void SerializeCustom(XmlWriter writer, XPathResult result, XPathNavigator node, IXmlSerializable value) { if (string.IsNullOrEmpty(node.NamespaceURI)) writer.WriteStartElement(node.LocalName); else { string prefix = result.Context.AddNamespace(node.NamespaceURI); writer.WriteStartElement(prefix, node.LocalName, node.NamespaceURI); } value.WriteXml(writer); writer.WriteEndElement(); } private static IXmlSerializable DeserializeCustom(XmlReader reader, XPathResult result, XPathNavigator node) { if (reader.NodeType == XmlNodeType.Element && reader.LocalName == node.LocalName && reader.NamespaceURI == node.NamespaceURI) { IXmlSerializable xmlSerializable = (IXmlSerializable)Activator.CreateInstance(result.Type); xmlSerializable.ReadXml(reader); return xmlSerializable; } return null; } } }