63

これは私が何年も苦労していたものなので、どこかに記録したいと思いました。(質問と回答で申し訳ありません。)

(C# .net 2.0) XmlSerializer によってシリアル化されているクラスがあり、新しいパブリック プロパティを追加しましたが、出力 XML に含まれていませんでした。

私が見つけたドキュメントには記載されていませんが、パブリック プロパティには、シリアル化するためのセットと取得が必要です。これは、シリアル化する場合は同じファイルから逆シリアル化する必要があると想定しているためだと思います。そのため、セットと取得の両方を持つプロパティのみをシリアル化します。

4

7 に答える 7

101

前述のように、ほとんどのプロパティには getter と setter の両方が必要です。これに対する主な例外はリストです - 例えば:

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

これは正常に機能します。ただし、セッターXmlSerializer が見つかった場合は、それがパブリックであることを要求します。以下は機能しません

public List<Foo> Bar {get; private set;} // FAIL

シリアル化されないその他の理由:

  • get および set で公開されていない (またはreadonlyフィールド用である)
  • 属性が[DefaultValue]あり、その値を持つ
  • bool ShouldSerializeFoo()false を返すpublicメソッドがある
  • bool FooSpecified {get;set;}false を返すpublicプロパティまたはフィールドがある
  • それはマークされています[XmlIgnore]
  • それはマークされています[Obsolete]

これらのいずれかにより、シリアル化されません

于 2009-02-22T19:39:34.870 に答える
7

getter + setterについてのポイントは、「Xmlシリアル化の概要」ページの3番目の段落で説明されています。それは実際にはコールアウトボックスにあります。見逃せません!

Intro-to-XMLシリアル化http://www.freeimagehosting.net/uploads/2f04fea2db.png

(Freeimagehosting.netを少し楽しんでいます)

于 2009-03-09T06:04:28.743 に答える
5

適切なセッターを実装したくない場合 (おそらくオブジェクトの値をデシリアライズしたり変更したりしたくないため)、このようなダミーset { }のセッターを使用するだけでXMLSerializer機能しますが、セッターを使用しても何も起こりません...

iE

public string ID { get { return _item.ID.ToString(); } set { } }
于 2012-08-08T15:02:31.763 に答える
5

また、null を返すプロパティはシリアル化されません!

于 2009-06-28T18:08:27.363 に答える
3

コレクションのシリアル化について追加するもう 1 つのこと:

XmlSerializer はインターフェイスのコレクションを無視します!

つまり、 ignoreを意味します。次のような行の例外が発生しますが:

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 に答える