C# 反序列化IXmlSerializable结构层次结构

C# 反序列化IXmlSerializable结构层次结构,c#,xml,struct,deserialization,hierarchy,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

我有以下情况:

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


谢谢您在
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
并调用其
反序列化
方法,类似于上面的序列化示例

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

对。默认情况下,它是这样工作的。您不必执行任何特殊操作来维护状态,只需传递
读取器
/
编写器
实例。只需递归地使用
XmlSerializer
即可(反)序列化嵌套的复杂对象

注意:有一个很好的教程