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 (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 (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 (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 (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 (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 (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;
}
}
}