如何从ReadXml()里面使用XmlSerializer

时间:2015-06-18 20:09:44

标签: c# .net xml serialization xml-serialization

我正在尝试了解如何使用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

这是预期的方法吗?如果没有创建额外的阅读器,有没有更好的方法呢?

0 个答案:

没有答案