反序列化IXmlSerializable结构层次结构

时间:2013-12-23 17:46:24

标签: c# xml struct deserialization hierarchy

我有以下情况:

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方法以便它们“堆叠”?我希望能够将我的读者传给一个孩子,而不必担心它会回到一个无法适应的状态。

由于

1 个答案:

答案 0 :(得分:1)

WriteXml中的Foo方法未正确实施。您应该致电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来(de)序列化嵌套的复杂对象。

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