当从List inheritance类时,XmlSerializer不会序列化其他属性
我在这里有一个情况,我需要从List
inheritance我的类,但是当我这样做时,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名称。
我希望这可以帮到你。