Cha*_*ana 6 .net xml xml-serialization ixmlserializable
如果使用自定义XML Serialization(IXmlSerialiable),在包含不使用自定义IXmlSerializable接口的组成复杂对象的属性的复杂对象上,如何在IXmlSerializable.ReadXml(XmlReader reader)方法中指定希望反序列化器对这些子属性使用普通反序列化?
注意:类似于这个问题
该IXmlSerializable是有点乏味执行,因为这几乎是给定的,你不能选择子类型普通XML序列化的全有或全无的方式.但是,如果我理解正确,您可以通过手动创建XmlSerializer未实现的类型来实现所需IXmlSerializable.
例如,如果我们从两个类开始Default,那么没有实现IXmlSerializable,Custom哪个实现它.
public class Default // Uses default XML Serialization
{
public int Count { get; set; }
}
public class Custom : IXmlSerializable
{
public int Count { get; set; }
public XmlSchema GetSchema() { throw new NotImplementedException(); }
public void ReadXml(XmlReader reader)
{
reader.ReadToDescendant("Count");
this.Count = reader.ReadElementContentAsInt();
}
public void WriteXml(XmlWriter writer)
{
writer.WriteStartElement("Custom");
writer.WriteElementString("Count", this.Count.ToString());
writer.WriteEndElement();
}
}
Run Code Online (Sandbox Code Playgroud)
然后我们创建一个第三个类Parent,它具有前面每个实例的子项,并IXmlSerializable以调用ReadXml/WriteXml支持它的子项的方法的方式实现,并为另一个子项创建默认的XML序列化程序.
public class Parent : IXmlSerializable
{
public Parent()
{
this.Default = new Default { Count = 1 };
this.Custom = new Custom { Count = 2 };
}
public Default Default { get; set; }
public Custom Custom { get; set; }
public XmlSchema GetSchema() { throw new NotImplementedException(); }
public void ReadXml(XmlReader reader)
{
reader.ReadToFollowing("Custom");
this.Custom = new Custom();
this.Custom.ReadXml(reader);
reader.ReadToFollowing("Default");
var serializer = new XmlSerializer(typeof(Default));
this.Default = (Default)serializer.Deserialize(reader);
}
public void WriteXml(XmlWriter writer)
{
this.Custom.WriteXml(writer);
var ns = new XmlSerializerNamespaces();
ns.Add("", "");
new XmlSerializer(typeof(Default)).Serialize(writer, this.Default, ns);
}
}
Run Code Online (Sandbox Code Playgroud)
要使示例完整,请对序列化和反序列化Parent实例的示例程序:
static void Main()
{
var sb = new StringBuilder();
var serializer = new XmlSerializer(typeof(Parent));
serializer.Serialize(new StringWriter(sb), new Parent());
Console.WriteLine(sb);
var parent = (Parent)serializer.Deserialize(new StringReader(sb.ToString()));
Console.WriteLine("Parent.Custom.Count: {0}", parent.Custom.Count);
Console.WriteLine("Parent.Default.Count: {0}", parent.Default.Count);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7583 次 |
| 最近记录: |