【问题标题】:Implementing IXmlSerializable on a collection object在集合对象上实现 IXmlSerializable
【发布时间】:2009-09-06 22:33:34
【问题描述】:

我有一个看起来有点像这样的 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 来进行一些自定义值转换。

【问题讨论】:

    标签: c# xml-serialization


    【解决方案1】:

    像这样修改你的代码:

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

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

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

    【讨论】:

      【解决方案2】:

      您不需要使用 IXmlSerializable。但如果你愿意,你应该实现 GetShema() 方法。经过一些修改后,代码看起来像这样:

          [XmlRoot("XmlObject")]
      public class XmlObject
      {
          [XmlElement("A")]
          public string A { get; set; }
          [XmlElement("B")]
          public string B { get; set; }
          [XmlElement("listitems")]
          public List<Item> listitems { get; set; }
      }
      
      public class Item : IXmlSerializable
      {
          [XmlElement("C")]
          public string C { get; set; }
          [XmlElement("D")]
          public string D { get; set; }
      
          #region IXmlSerializable Members
      
          public System.Xml.Schema.XmlSchema GetSchema()
          {
              throw new NotImplementedException();
          }
      
          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);
          }
      
          #endregion
      }
      

      itemlist 中 2 个项目的结果如下所示:

      <?xml version="1.0" encoding="utf-8"?>
      <XmlObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <A>value</A>
        <B>value</B>
        <listitems>
          <C>value0</C>
          <D>value0</D>
        </listitems>
        <listitems>
          <C>value1</C>
          <D>value1</D>
        </listitems>
      </XmlObject>
      

      【讨论】:

        猜你喜欢
        • 2010-10-31
        • 1970-01-01
        • 1970-01-01
        • 2019-04-30
        • 1970-01-01
        • 1970-01-01
        • 2016-11-18
        • 1970-01-01
        • 2014-06-22
        相关资源
        最近更新 更多