为什么不是我的公共属性由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并手动执行序列化,并从序列化属性中受益,反之亦然,使用构造函数/专用字段赋值将其反序列化。