为什么我的公共属性不是由XmlSerializer序列化的?

Ror*_*ory 58 .net c# xml-serialization

这是我多年来一直在努力的一个,所以以为我会在某个地方记录.(对提问和回答问题表示歉意.)

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

在我找不到的文档中没有提到它,但公共属性必须有一个集合以及一个序列化!我想这是因为它假设如果你要序列化然后你想要从同一个文件反序列化,所以只序列化同时具有set和get的属性.

Mar*_*ell 91

如上所述,大多数属性必须同时具有getter和setter; 这个的主要例外是列表 - 例如:

private readonly List<Foo> bar = new List<Foo>();
public List<Foo> Bar {get { return bar; } } // works fine
Run Code Online (Sandbox Code Playgroud)

这将工作正常; 但是,如果XmlSerializer 找到一个二传手 - 它要求它是公开的; 以下将无法正常工作:

public List<Foo> Bar {get; private set;} // FAIL
Run Code Online (Sandbox Code Playgroud)

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

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

其中任何一个都会导致它不能序列化

  • [Foo] 指定的序列化程序“gotcha”让我难住了。使用第 3 方 XML,文档非常糟糕,具有 *AmountPaid* 公共十进制属性和 *AmountPaidSpecified* 公共 bool 属性。AmountPaidSpecified 的默认值为 false,因为它是一个布尔值。所以,AmountPaid 从未被序列化!通过将 AmountPaidSpecified 设置为 true,瞧!AmountPaid 被序列化。 (3认同)
  • 在某些情况下,返回集合的属性不需要集合,但必须在构造函数中初始化...对于没有公共构造函数的集合就是这种情况.但这种行为对我来说似乎有些不一致...... (2认同)
  • 如果属性标记为"[Obsolete]",它也不会序列化. (2认同)
  • @ user384080大多数序列化器都希望在两个方向上使用**** - 即序列化和反序列化.如果没有`set`,它将无法在反序列化期间重新创建对象,因为它无法分配值.现在,有时候序列化程序可以解决这个问题,有时它们只是序列化它而不承诺反序列化; 但是,`XmlSerializer`选择"忽略属性"方法. (2认同)

Che*_*eso 7

关于getter + setter的观点是在" Xml序列化简介 "页面的第3段中提出的.它实际上是在一个标注框中.不能错过!

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

(与Freeimagehosting.net有点太多的乐趣)

  • 答案中链接的图像被破坏了 (3认同)

ano*_*ous 5

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


Jon*_*chn 5

如果你不想实现正确的Setter(因为你可能不想反序列化或更改对象值),你可以使用像这样的虚拟设置器set { },这样就可以了XMLSerializer,但如果使用Setter则没有任何反应......

public string ID { get { return _item.ID.ToString(); } set { } }
Run Code Online (Sandbox Code Playgroud)

  • 如果初级程序员使用此setter属性并认为它正在设置值,这可能是一个问题.仍然喜欢"抛出新的例外......" (2认同)