首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在复杂对象图上使用IXmlSerializable接口

在复杂对象图上使用IXmlSerializable接口
EN

Stack Overflow用户
提问于 2010-07-02 15:27:57
回答 1查看 8.5K关注 0票数 6

如果使用自定义XML (IXmlSerialiable),在包含具有而不是的组成复杂对象的属性的复杂对象上使用自定义IXmlSerializable接口,如何在IXmlSerializable.ReadXml(XmlReader reader)方法中指定反序列化器对这些子属性使用常规反序列化?

注:类似于this question

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-02 17:39:05

IXmlSerializable的实现有点繁琐,因为它几乎是一种完全或无意义的方法,因为您不能为常规的XML序列化选择子类型。但是,如果我正确地理解了您的意思,您可以通过为不实现XmlSerializer的类型手动创建IXmlSerializable来实现您想要的结果。

例如,如果我们从两个类开始,Default不实现IXmlSerializableCustom实现它。

代码语言:javascript
复制
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序列化程序。

代码语言:javascript
复制
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实例的示例程序:

代码语言:javascript
复制
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);
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3167067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档