web-dev-qa-db-ja.com

自動実装されたプロパティがシリアル化されないようにするにはどうすればよいですか?

自動実装されたプロパティがバイナリフォーマッタによってシリアル化されないようにするにはどうすればよいですか? [NonSerialized]属性は、フィールドでのみ使用できます。また、自動実装されたプロパティを使用すると、フィールドは非表示になります。

37
hopla

自動実装されたプロパティではサポートされていません。バッキングフィールドを使用して、 NonSerializedAttribute を設定する必要があります。

public class ClassWithNonSerializedProperty {

  [NonSerialized]
  private object _data;  // Backing field of Property Data that is not serialized

  public object Data{
    get { return _data; }
    set { _data = value; }
  }
}
60
Jehof
// This works for the underlying delegate of the `event` add/remove mechanism.
[field:NonSerialized]
public event EventHandler SomethingHappened;

しかし、自動実装されたプロパティには当てはまらないようです。イベントサブスクライバーがアタッチされたオブジェクトをシリアル化するときに知っておくと便利なので、言及する価値があると思いました。

7
xyz

Jsonにシリアル化して、 Json.NETシリアライザー (市場に出回っている他の多くのシリアライザーよりも提供できるものがたくさんあるので、これを強くお勧めします)を使用している場合は、 [JsonIgnore]を使用したプロパティでの望ましい結果。

フィールドを作成する必要はありません。

したがって、コードは次のようになります。

public class ClassName
{
     [JsonIgnore]   
     public object IgnoreMe { get; set; } 

     public object DoNotIgnoreMe { get; set; } 
}
6
Bern

自動実装されたプロパティでは不可能です。次のことを検討してください。

この動作は「仕様による」ものです。自動プロパティが実装されたときの決定は、「一般的なケース」で機能するというものでした。これは、とりわけ、生成されたフィールドに属性がないことを意味します。その背後にある考え方は、それらを単純に保ち、ゆっくりと完全なプロパティに変更しないことです。したがって、NonSerialized属性を使用する必要がある場合は、完全なプロパティが最適です。

http://social.msdn.Microsoft.com/Forums/en-US/vcsharp2008prerelease/thread/2b6eb489-122a-4418-8759-10808252b195

5

できるかわかりません。これ SerializableAttributeに関するMSDNの記事 は、ISerializableを実装し、シリアル化を自分で制御することを提案しています。

SerializableAttributeでマークされたタイプのすべてのパブリックフィールドとプライベートフィールドは、タイプがシリアル化プロセスをオーバーライドするISerializableインターフェイスを実装していない限り、デフォルトでシリアル化されます。

または、その特定のフィールドの自動プロパティから切り替えます。

5
Neil Barnwell

Xmlにシリアル化する場合は、XmlIgnore属性を使用できます。

3
Danil

シリアル化されていないバッキングフィールドを使用するという提案されたソリューションは、.NET 4.0では正しく機能しないようです(少なくともXmlシリアル化の場合)。フィールドは実際にはシリアル化されませんが、それを使用するパブリックプロパティはシリアル化されるため、目的が無効になります。 XmlIgnoreの回避策を使用すると、Xmlシリアル化の場合に役立ちます。免責事項-バイナリシリアル化の動作を確認しませんでした。

2
LRaiz