Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么不是';XmlSerializer是否序列化了我的公共属性?_C#_.net_Xml Serialization - Fatal编程技术网

C# 为什么不是';XmlSerializer是否序列化了我的公共属性?

C# 为什么不是';XmlSerializer是否序列化了我的公共属性?,c#,.net,xml-serialization,C#,.net,Xml Serialization,这是一个我挣扎了很久的问题,所以我想我应该在某个地方记录下来。(对提问和回答问题表示歉意。) (C#.net 2.0) 我有一个被XmlSerializer序列化的类,我添加了一个新的公共属性,但是它没有包含在输出XML中 在我能找到的任何地方的文档中都没有提到它,但是公共属性必须有一个集合和一个get才能被序列化!我猜这是因为它假设如果要序列化,那么您将要从同一个文件反序列化,因此只序列化同时具有set和get的属性。如前所述,大多数属性必须同时具有getter和setter;这方面的主要例外

这是一个我挣扎了很久的问题,所以我想我应该在某个地方记录下来。(对提问和回答问题表示歉意。)

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


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

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

private readonly List<Foo> bar = new List<Foo>();
public List<Foo> Bar {get { return bar; } } // works fine
它可能无法序列化的其他原因:

  • 它不是get和set的公共字段(或者是字段的
    readonly
  • 它有一个
    [DefaultValue]
    属性,并且与该值相同
  • 它有一个public
    bool ShouldSerializeFoo()
    方法,该方法返回false
  • 它有一个公共
    bool属性或字段{get;set;}
    返回false
  • 它被标记为
    [XmlIgnore]
  • 它被标记为
    [过时]

其中任何一个都会导致它无法序列化

关于getter+setter的观点在“”页的第3段中提出。它实际上在一个呼叫箱里。不会错过的


(使用Freeimagehosting.net有点太有趣了)

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

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

如果您不想实现正确的Setter(因为您可能既不想反序列化也不想更改对象值),您可以只使用像这样的伪Setter
set{}
,这样
XMLSerializer
就可以工作,但是如果您使用Setter,就不会发生任何事情

i、 E


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

XmlSerializer忽略接口集合

我的意思是忽略。而您将得到一个异常,例如:

public IFoo Foo { get; set; }
您不会得到以下情况的例外:

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

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

啊,您是对的,它就在那里,但您不能错过它:)我读过一篇研究文章,也就是说,人们忽视标题和文章中的方框,比忽略常规文本更为常见??适得其反。@Cheeso:没错,我从来不看谷歌搜索结果中的赞助商链接;)我很好奇为什么支持只读集合,而只读属性却不支持..?答案中链接的图像在某些情况下被破坏,返回集合的属性不需要集合,但必须在构造函数中初始化。。。没有公共构造函数的集合就是这种情况。但是这种行为对我来说似乎有点不一致……如果属性被标记为
[过时]
,它也不会序列化。有一个getter但没有setter…哇,这很恼人,请欣赏这篇文章。@user384080大多数序列化程序都希望在两个方向上使用-即序列化和反序列化。如果没有
,它将无法在反序列化期间重新创建对象,因为它无法赋值。现在,有时候序列化程序可以解决这个问题,有时候他们只是序列化它而不承诺反序列化;然而,
XmlSerializer
选择了“忽略属性”方法。指定的[Foo]序列化程序“gotcha”让我难堪。使用第三方XML,使用非常糟糕的文档,该文档具有amountPaids公共十进制属性和amountPaids指定的公共bool属性。AmountPaidSpecified的默认值为false,因为它是布尔值。所以,AmountPaid从未被序列化!通过将AmountPaidSpecified设置为true,瞧!,AmountPaid被序列化。啊,但是返回null的可空类型属性是!我这里有这个?GroupTypeId属性序列化到这个XML中-如果初级程序员使用这个setter属性并认为它正在设置值,这可能会成为一个问题。还是喜欢有“抛出新异常…”啊,但为什么呢?有人知道吗?
public IFoo Foo { get; set; }
public ICollection<IFoo> LotsOfFoos { get { return this.fooBackingField; } }