【问题标题】:Deserializing IXmlSerializable struct hierarchy反序列化 IXmlSerializable 结构层次结构
【发布时间】:2013-12-23 17:46:23
【问题描述】:

我有以下场景:

public struct Foo : IXmlSerializable
{
    public Bar bar;
}

public struct Bar : IXmlSerializable
{
}

我希望能够从 XML 序列化/反序列化 Foo。 WriteXml 方法很容易实现:

public void WriteXml(XmlWriter writer)
{
    writer.WriteStartElement("bar");
    this.bar.WriteXml(writer);
    writer.WriteEndElement();
}

但我不知道如何编写 ReadXml 方法。

public void ReadXml(XmlReader reader)
{
    reader.MoveToContent();

    ????

    reader.ReadEndElement();
}

首先,我需要实例化一个新的 Bar 实例来调用 ReadXml 吗?

其次,我如何编写 ReadXml 方法以便它们“堆叠”?我希望能够将我的阅读器传递给一个孩子,而不必担心它会以不适当的状态返回。

谢谢

【问题讨论】:

    标签: c# xml struct deserialization hierarchy


    【解决方案1】:

    Foo 中的 WriteXml 方法未正确实现。您应该调用XmlSerializer 来序列化Bar 实例,而不是手动调用它的WriteXml

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteStartElement("bar");
        new XmlSerializer(typeof(Bar)).Serialize(writer, bar);
        writer.WriteEndElement();
    }
    

    首先,我需要实例化一个新的 Bar 实例来调用 ReadXml 吗?

    没有。而是使用XmlSerializer 并调用其Deserialize 方法,类似于上面的序列化示例。

    其次,如何编写 ReadXml 方法以便它们“堆叠”?我希望能够将我的阅读器传递给一个孩子,而不必担心它会以不适当的状态返回。

    是的。默认情况下它以这种方式工作。您不必做任何特别的事情来维护状态,但通过 reader / writer 实例。只需递归地使用XmlSerializer 来(反)序列化嵌套的复杂对象。

    注意:有一个很好的教程here

    【讨论】:

      猜你喜欢
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 2016-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多