在复杂对象图上使用 IXmlSerialized 接口

2023-11-21

如果使用自定义 XML 序列化 (IXmlSerialiable),在一个复杂对象上,该对象包含具有组成复杂对象的属性,这些属性NOT使用自定义IXmlSerializable接口,你如何指定,在IXmlSerializable.ReadXml(XmlReader reader)方法,您希望反序列化器对这些子属性使用普通的反序列化?

注意:类似于这个问题


The IXmlSerializable实现起来有点乏味,因为它几乎是一种全有或全无的方法,因为您无法为正常的 XML 序列化选择子类型。但是,如果我理解正确,您可以通过手动创建来实现您想要的XmlSerializer对于未实现的类型IXmlSerializable.

例如,如果我们从两个类开始,Default不执行IXmlSerializable and 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();
    }
}

然后我们创建第三个类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);
    }
}

为了使示例完整,我们提供一个序列化和反序列化的示例程序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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在复杂对象图上使用 IXmlSerialized 接口 的相关文章

随机推荐