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