63

这是我多年来一直在苦苦挣扎的一个,所以我想我会在某个地方记录下来。(很抱歉提出和回答问题。)

(C# .net 2.0) 我有一个由 XmlSerializer 序列化的类,我添加了一个新的公共属性,但它没有包含在输出 XML 中。

在我能找到的任何地方的文档中都没有提到它,但是公共属性必须有一个 set 和一个 get 才能被序列化!我猜这是因为它假设如果你要序列化,那么你会想要从同一个文件反序列化,所以只序列化同时具有 set 和 get 的属性。

4

7 回答 7

101

如前所述,大多数属性必须同时具有 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

它可能无法序列化的其他原因:

  • 它不与 get 和 set 公开(或readonly用于字段)
  • 它有一个[DefaultValue]属性,并且具有该值
  • 它有一个bool ShouldSerializeFoo()返回 false 的公共方法
  • 它有一个bool FooSpecified {get;set;}返回 false 的公共属性或字段
  • 它被标记[XmlIgnore]
  • 它被标记[Obsolete]

任何这些都会导致它不序列化

于 2009-02-22T19:39:34.870 回答
7

关于 getter+setter 的观点在“ Intro to Xml Serialization ”页面的第 3 段中提出。它实际上是在一个呼叫框。不能错过!

XML 序列化简介 http://www.freeimagehosting.net/uploads/2f04fea2db.png

(在 Freeimagehosting.net 上玩得太开心了)

于 2009-03-09T06:04:28.743 回答
5

返回 null 的属性也不会序列化!

于 2009-06-28T18:08:27.363 回答
5

如果您不想实现正确的 Setter(因为也许您既不想反序列化或更改对象值),您可以只使用像这样的虚拟设置器set { },这样就可以了XMLSerializer,但是如果您使用 Setter,什么都不会发生...

IE

public string ID { get { return _item.ID.ToString(); } set { } }
于 2012-08-08T15:02:31.763 回答
3

关于集合序列化的另一件事:

XmlSerializer 忽略接口集合!

我的意思是忽略。虽然您会遇到以下行的异常:

public IFoo Foo { get; set; }

不会得到例外:

public ICollection<IFoo> LotsOfFoos { get { return this.fooBackingField; } }
于 2014-09-12T14:58:19.517 回答
2

如果你的类继承了一个列表并且也有它自己的成员,那么只有列表中的元素会被序列化。您的班级成员中存在的数据不会被捕获。花了一些时间弄清楚这个!

于 2012-04-17T09:47:07.223 回答
0

您可以IXmlSerializer手动实现和执行序列化,并从序列化属性中受益,反之亦然,使用构造函数/私有字段分配反序列化它们。

于 2014-10-10T01:13:20.467 回答