我有一个看起来像这样的xml文件:

<xml>
  <A>value</A>
  <B>value</B>
  <listitems>
    <item>
      <C>value</C>
      <D>value</D>
    </item>
  </listitems>
</xml>

我有两个对象代表这个xml:
class XmlObject
{
  public string A { get; set; }
  public string B { get; set; }
  List<Item> listitems { get; set; }
}

class Item : IXmlSerializable
{
  public string C { get; set; }
  public string D { get; set; }

  //Implemented IXmlSerializeable read/write
  public void ReadXml(System.Xml.XmlReader reader)
  {
    this.C = reader.ReadElementString();
    this.D = reader.ReadElementString();
  }
  public void WriteXml(System.Xml.XmlWriter writer)
  {
    writer.WriteElementString("C", this.C);
    writer.WriteElementString("D", this.D);
  }
}

我使用XmlSerializer将XmlObject序列化/反序列化到文件。

问题是,当我在“子对象”项上实现自定义IXmlSerializable函数时,在反序列化文件时,我总是在XmlObject.listitems集合中仅获得一个项(第一个)。
如果我删除了:IXmlSerializable,那么一切都会按预期进行。

我做错了什么?

编辑:我已经实现了IXmlSerializable.GetSchema,并且需要在我的“子对象”上使用IXmlSerializable来进行一些自定义值转换。

最佳答案

像这样修改您的代码:

    public void ReadXml(System.Xml.XmlReader reader)
    {
        reader.Read();
        this.C = reader.ReadElementString();
        this.D = reader.ReadElementString();
        reader.Read();
    }

首先,您跳过Item节点的开头,读取两个字符串,然后从结束节点读取,以使阅读器位于正确的位置。这将读取阵列中的所有节点。

您自己修改xml时需要注意:)

10-06 12:34