我正在尝试了解如何使用XmlSerializer
从外部类的<n>
方法中反序列化嵌套类的ReadXml()
个实例。我遇到的是对XmlSerializer.Deserialize()
的嵌套调用会导致跳过节点。
XML文档看起来像这样:
<outerType>
<innerType id="1">structure</innerType>
<innerType id="2">structure</innerType>
<otherElement />
</outerType>
反序列化outerType
的规则需要实施IXmlSerializable
。但是innerType
可以通过使用XmlSerializer.Deserialize()来反序列化。 OuterType的ReadXml()
方法最终看起来像这样:
public void ReadXml(System.Xml.XmlReader reader)
{
while (reader.Read())
{
if (reader.Name == "innerType")
{
XmlSerializer innerSer = new XmlSerializer(typeof(InnerType));
InnerType obj = (InnerType)innerSer.Deserialize(reader);
}
else
// Do some other logic
}
}
第一次循环时,type变量接收<innerType id="1"/>
元素中包含的结构。但循环永远不会遇到<innerType id="2"/>
元素。
在调试器中使用它之后,我相信发生的事情是在调用innerSer.Deserialize()
之前,读者指向<innerType id="1"/>
的开始标记,然后立即指向开头<innerType id="2"/>
的标记。在循环的顶部,对XmlReader.Read()
的调用将reader
提升到下一个元素,并且永远不会读取<innerType id="2"/>
。
我见过的用于反序列化对象集合的一些解决方案提出了类似的内容:
XmlSerializer innerSer = new XmlSerializer(typeof(InnerType));
InnerType obj1 = (InnerType)innerSer.Deserialize(reader);
InnerType obj2 = (InnerType)innerSer.Deserialize(reader);
但在我的特定情况下,我需要使用<n>
的{{1}}个实例。
我发现工作的是创建第二个XmlReader,其中包含InnerType
子树的副本,如:
InnerType
这是预期的方法吗?如果没有创建额外的阅读器,有没有更好的方法呢?