这是我多年来一直在苦苦挣扎的一个,所以我想我会在某个地方记录下来。(很抱歉提出和回答问题。)
(C# .net 2.0) 我有一个由 XmlSerializer 序列化的类,我添加了一个新的公共属性,但它没有包含在输出 XML 中。
在我能找到的任何地方的文档中都没有提到它,但是公共属性必须有一个 set 和一个 get 才能被序列化!我猜这是因为它假设如果你要序列化,那么你会想要从同一个文件反序列化,所以只序列化同时具有 set 和 get 的属性。
这是我多年来一直在苦苦挣扎的一个,所以我想我会在某个地方记录下来。(很抱歉提出和回答问题。)
(C# .net 2.0) 我有一个由 XmlSerializer 序列化的类,我添加了一个新的公共属性,但它没有包含在输出 XML 中。
在我能找到的任何地方的文档中都没有提到它,但是公共属性必须有一个 set 和一个 get 才能被序列化!我猜这是因为它假设如果你要序列化,那么你会想要从同一个文件反序列化,所以只序列化同时具有 set 和 get 的属性。
如前所述,大多数属性必须同时具有 getter 和 setter;主要的例外是列表 - 例如:
private readonly List<Foo> bar = new List<Foo>();
public List<Foo> Bar {get { return bar; } } // works fine
这将正常工作;但是,如果XmlSerializer
找到一个 setter - 它要求它是公开的;以下将不起作用:
public List<Foo> Bar {get; private set;} // FAIL
它可能无法序列化的其他原因:
readonly
用于字段)[DefaultValue]
属性,并且具有该值bool ShouldSerializeFoo()
返回 false 的公共方法bool FooSpecified {get;set;}
返回 false 的公共属性或字段[XmlIgnore]
[Obsolete]
任何这些都会导致它不序列化
关于 getter+setter 的观点在“ Intro to Xml Serialization ”页面的第 3 段中提出。它实际上是在一个呼叫框。不能错过!
XML 序列化简介 http://www.freeimagehosting.net/uploads/2f04fea2db.png
(在 Freeimagehosting.net 上玩得太开心了)
返回 null 的属性也不会序列化!
如果您不想实现正确的 Setter(因为也许您既不想反序列化或更改对象值),您可以只使用像这样的虚拟设置器set { }
,这样就可以了XMLSerializer
,但是如果您使用 Setter,什么都不会发生...
IE
public string ID { get { return _item.ID.ToString(); } set { } }
关于集合序列化的另一件事:
XmlSerializer 忽略接口集合!
我的意思是忽略。虽然您会遇到以下行的异常:
public IFoo Foo { get; set; }
你不会得到例外:
public ICollection<IFoo> LotsOfFoos { get { return this.fooBackingField; } }
如果你的类继承了一个列表并且也有它自己的成员,那么只有列表中的元素会被序列化。您的班级成员中存在的数据不会被捕获。花了一些时间弄清楚这个!
您可以IXmlSerializer
手动实现和执行序列化,并从序列化属性中受益,反之亦然,使用构造函数/私有字段分配反序列化它们。