c# - 在集合对象上实现 IXmlSerializable

标签 c# xml-serialization

我有一个看起来像这样的 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需要注意:)

关于c# - 在集合对象上实现 IXmlSerializable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1385382/

相关文章:

c# - SQLite3 中存储过程的替代方案

java - Xstream - 字符串数组

c# - .NET 序列化排序

c# - v4.0 的 .NET 版本定义发生了什么变化?

c# - 无法从 hMailServer 连接/发送

c# - 为什么 SelectSingleNode 返回 null?

c# - 反序列化具有相同元素名称但不同属性的 Xml

c# - XSLt.transform 给我 ""

c# - 可选属性默认值的 XML 序列化

.net - 反序列化缺失整数时不同的 .NET XML 序列化器行为