当从List inheritance类时,XmlSerializer不会序列化其他属性

我在这里有一个情况,我需要从Listinheritance我的类,但是当我这样做时,XmlSerializer不会序列化我的类中声明的任何属性或字段,以下示例演示:

 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 { public MyClass() { } int myAttribute = 2011; [XmlAttribute] public int MyAttribute { get { return myAttribute; } set { myAttribute = value; } } } 

结果XML:

   1 2 3  

这是设计的。 我不知道为什么做出这个决定, 但是文件中说明了这一点 :

  • 实现ICollection或IEnumerable的类。 只有集合是序列化的,而不是公共属性。

(查看“可以序列化的项目”部分)。 有人提出了一个针对此的错误,但它不会被更改 – 在这里,微软还确认不包括实现ICollection类的属性实际上是XmlSerializer的行为。

解决方法是:

  • 实现IXmlSerializable并自己控制序列化。

要么

  • 更改MyClass,使其具有List类型的公共属性(并且不对其进行子类化)。

要么

  • 使用DataContractSerializer来处理此方案。

这是一个让你考虑的问题。

你可以有一个像这样的容器类的类:

 class ContainerObject { public int MyNewProperty { get; set; } [XmlElement("")] public List MyList { get; set; } } 

诀窍是在List元素上方使用XmlElement name =“”。

当这被序列化为xml时,您将拥有:

  ... ... ...  

如果您愿意,还可以为列表中的项目创建另一个类

  class MyItem { public int MyProperty {get;set;} } 

然后不是拥有整数列表,而是拥有一个MyItem列表。

这是您控制列表中每个项目的XmlElement名称。

我希望这可以帮到你。