我在这里遇到一种情况,我需要从继承我的类List<ItemType>,但是当我这样做时,XmlSerializer不会序列化我类中声明的任何属性或字段,下面的示例演示:
List<ItemType>
public partial class Form1 : Form { public Form1() { InitializeComponent(); DoSerialize(); } private void DoSerialize() { MyClass obj = new MyClass(); obj.Add(1); obj.Add(2); obj.Add(3); XmlSerializer s = new XmlSerializer(typeof(MyClass)); StringWriter sw = new StringWriter(); s.Serialize(sw, obj); } } [Serializable] [XmlRoot] public class MyClass : List<int> { public MyClass() { } int myAttribute = 2011; [XmlAttribute] public int MyAttribute { get { return myAttribute; } set { myAttribute = value; } } }
产生的XML:
<?xml version="1.0" encoding="utf-16"?> <ArrayOfInt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <int>1</int> <int>2</int> <int>3</int> </ArrayOfInt>
这是设计使然。我不知道为什么要做出这个决定,但是它在文档中说明:
实现ICollection或IEnumerable的类。仅集合是序列化的,不是公共属性。
(在“可以序列化的项目”部分下查找)。有人对此提出了一个错误,但不会更改 -在这里,Microsoft还确认不包括实现类的属性ICollection实际上是XmlSerializer的行为。
ICollection
解决方法是:
IXmlSerializable
要么