XmlSerializer不会序列化我班级中的所有内容

时间:2009-11-25 16:02:14

标签: c# list xml-serialization ienumerable

我有一个非常基本的类,它是一个子类列表,加上一些摘要数据。

[Serializable]
public class ProductCollection : List<Product>
{
    public bool flag { get; set; }
    public double A { get; set; }
    public double B { get; set; }
    public double C { get; set; }
}

...

// method to save this class
private void SaveProductCollection()
{
    // Export case as XML...
    XmlSerializer xml = new XmlSerializer(typeof(ProductCollection));
    StreamWriter sw = new StreamWriter("output.xml");
    xml.Serialize(sw, theCollection);
    sw.Close();
}

[Serializable] public class ProductCollection : List<Product> { public bool flag { get; set; } public double A { get; set; } public double B { get; set; } public double C { get; set; } }

当我致电// method to save this class private void SaveProductCollection() { // Export case as XML... XmlSerializer xml = new XmlSerializer(typeof(ProductCollection)); StreamWriter sw = new StreamWriter("output.xml"); xml.Serialize(sw, theCollection); sw.Close(); } 时,我得到以下信息:

SaveProductCollection()

请注意,我有基本类型:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfProduct xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Product>
    <InputType>1</InputType>
  </Product>
  <Product>
    <InputType>1</InputType>
  </Product>
</ArrayOfProduct>
。但是我没有任何类属性:flag,A,B,C。

我做错了什么吗?怎么了?

更新感谢您的回复。我不知道它是按设计的。我已经转换为BinaryFormatter(用于二进制序列化),它工作得非常好。

3 个答案:

答案 0 :(得分:7)

关注msdn

问:为什么集合类的所有属性都没有序列化?

答:XmlSerializer在检测到IEnumerable或ICollection接口时仅序列化集合中的元素。此行为是设计使然。唯一的解决方法是将自定义集合重新分解为两个类,其中一个类公开属性,包括一个纯集合类型。

答案 1 :(得分:0)

首先,在创建自己的集合类型时,您应该继承System.Collections.ObjectModel.Collection<T>,这将允许您覆盖InsertItem和其他方法以获得对集合的完全控制。

要回答您的问题,XmlSerializer会以不同的方式处理集合类型,以序列化集合中的项目。它不会序列化任何属性(例如,List<T>.Capacity)。

您可以将属性移动到包含属性或集合的其他类型。

您也可以尝试使用attributes that control XML serialization,但我不确定他们是否会提供帮助。

答案 2 :(得分:-3)

尝试将XmlAttribute添加到您的属性中,因此它们将被序列化为属性。 像:

 [XmlAttribute("flag")]
 public bool flag { get; set; }