我有一个非常基本的类,它是一个子类列表,加上一些摘要数据。
[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()
请注意,我有基本类型:
。但是我没有任何类属性:flag,A,B,C。<?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>
我做错了什么吗?怎么了?
更新感谢您的回复。我不知道它是按设计的。我已经转换为BinaryFormatter(用于二进制序列化),它工作得非常好。
答案 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; }