为什么不是我的公共属性由XmlSerializer序列化?
这是我奋斗了一段时间,所以认为我会在某个地方文件。 (抱歉问和回答问题。)
(C#.net 2.0)我有一个正在由XmlSerializer序列化的类,我添加了一个新的公共属性,但它没有被包含在输出XML中。
在我能find的任何文档中都没有提到,但是公共属性必须有一个集合以及一个被序列化的集合! 我想这是因为它假定如果你要序列化,那么你会想要从同一个文件反序列化,所以只序列化具有一个集合和一个get的属性。
如前所述,大多数财产必须同时拥有一个吸气和二传手; 主要的例外是列表 – 例如:
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]
属性,并具有该值 - 它有一个返回false的公共
bool ShouldSerializeFoo()
方法 - 它有一个公共
bool FooSpecified {get;set;}
属性或返回false的字段 - 它被标记为
[XmlIgnore]
- 它被标记为
[Obsolete]
任何这些都会导致它不能序列化
关于getter + setter的一点是在“ Intro to Xml Serialization ”页面的第3段中进行的。 这实际上是在一个电话框中。 不能错过!
XML序列化简介http://www.freeimagehosting.net/uploads/2f04fea2db.png
(与Freeimagehosting.net有点太多的乐趣)
如果你不想实现合适的Setter(因为也许你不想反序列化或改变一个对象的值),你可以使用像这样的伪setter set { }
,以便XMLSerializer
工作,但是如果你使用二传手…
即
public string ID { get { return _item.ID.ToString(); } set { } }
另外返回null的属性不会被序列化!
如果你的类inheritance了一个列表并且也有它自己的成员,那么只有列表的元素被序列化。 您的class级成员中的数据不会被捕获。 花了一些时间搞清楚这一点!
还有一件事要补充关于系列化的collections:
XmlSerializer忽略接口的集合!
我的意思是忽略 。 虽然你会得到一个例外,如:
public IFoo Foo { get; set; }
你不会得到一个例外:
public ICollection<IFoo> LotsOfFoos { get { return this.fooBackingField; } }
您可以实现IXmlSerializer
并手动执行序列化,并从序列化属性中受益,反之亦然,使用构造函数/专用字段赋值将其反序列化。