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

时间:2009-02-22 18:45:05

标签: c# .net xml-serialization

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

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

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

7 个答案:

答案 0 :(得分:88)

如上所述,大多数属性必须同时具有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]属性,并且具有该值
  • 它有一个返回false的公共bool ShouldSerializeFoo()方法
  • 它有一个公共bool FooSpecified {get;set;}属性或字段,返回false
  • 标记为[XmlIgnore]
  • 标记为[Obsolete]

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

答案 1 :(得分:7)

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

Intro-to-XML Serialization http://www.freeimagehosting.net/uploads/2f04fea2db.png

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

答案 2 :(得分:5)

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

public string ID { get { return _item.ID.ToString(); } set { } }

答案 3 :(得分:4)

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

关于集合序列化还需要补充一点:

XmlSerializer忽略接口集合!

我的意思是忽略。虽然你会得到一个如下行的例外:

public IFoo Foo { get; set; }

您将 获取例外:

public ICollection<IFoo> LotsOfFoos { get { return this.fooBackingField; } }

答案 6 :(得分:0)

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