在集合对象上实现IXmlSerializable

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

 value value   value value    

我有两个代表这个xml的对象:

 class XmlObject { public string A { get; set; } public string B { get; set; } List 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时需要注意:)

您不需要使用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 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个项目的结果将如下所示:

   value value  value0 value0   value1 value1