37

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

4

7 に答える 7

60

自動実装されたプロパティではサポートされていません。バッキングフィールドを使用して、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; }
  }
}
于 2009-11-13T10:29:47.010 に答える
7
// This works for the underlying delegate of the `event` add/remove mechanism.
[field:NonSerialized]
public event EventHandler SomethingHappened;

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

于 2009-11-13T10:41:20.917 に答える
6

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

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

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

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

     public object DoNotIgnoreMe { get; set; } 
}
于 2013-07-19T10:08:40.623 に答える
5

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

于 2009-11-13T10:26:49.247 に答える
5

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

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

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

于 2009-11-13T10:28:40.507 に答える
5

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

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

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

于 2010-01-14T16:01:29.270 に答える
2

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

于 2011-12-12T23:41:51.113 に答える