这是我多年来一直在苦苦挣扎的人,所以以为我会在某个地方记录。 (对提问和回答问题表示歉意。)
(C#.net 2.0) 我有一个由XmlSerializer序列化的类,我添加了一个新的公共属性,但它没有包含在输出XML中。
在我找不到的文档中没有提到它,但公共属性必须有一个集合以及序列化!我想这是因为它假设如果你要序列化然后你想要从同一个文件反序列化,所以只序列化同时具有set和get的属性。
答案 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
可能无法序列化的其他原因:
readonly
为字段)[DefaultValue]
属性,并且具有该值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
并手动执行序列化,并从序列化属性中受益,反之亦然,使用构造函数/私有字段赋值对它们进行反序列化。