6
[Serializable]
class MyClass
{
    [NonSerialized] int Foo { get; set; } // error
    [NonSerialized] int bar; // ok
}

なぜこれが許可されないのですか?

次のような回避策について知っています

  • ISerializableの実装
  • XmlSerializer/XmlIgnoreへの切り替え
  • 手動で実装されたプロパティへの切り替え

問題は、具体的には、[NonSerialized]がプロパティでは許可されていないのに、フィールドでは許可されている理由です。

4

3 に答える 3

12

プロパティは実際にはメソッドであり、バイナリ シリアル化プロセスによってシリアル化されません。シリアル化されるのはフィールドです。したがってNonSerialized、フィールドで指定することだけが意味があります。

于 2010-09-21T13:50:25.200 に答える
3

これは、あなたの側でより多くの努力を必要とする、きめの細かい制御のケースだと思います。つまり、自動プロパティにはデフォルトでシリアル化可能なバッキング フィールドがあります。デフォルト以外が必要な場合は、自動プロパティを使用できません。

プロパティに対して使用するとうまくいくかもしれないと思っていまし[field:NonSerialized]たが、うまくいきません。C# の仕様では、バッキング フィールドのシリアル化可能性について明示的に言及していませんが、これには含まれています (10.7.3)。

The following example:
 public class Point {
    public int X { get; set; } // automatically implemented
    public int Y { get; set; } // automatically implemented
}
is equivalent to the following declaration:
public class Point {
    private int x;
    private int y;
    public int X { get { return x; } set { x = value; } }
    public int Y { get { return y; } set { y = value; } }
}

したがって、バッキング フィールドはシリアライズ可能です (デフォルト)。

于 2010-09-21T13:48:00.413 に答える
0

IgnoreDataMemberAttributeWCF を使用している場合は、確認することをお勧めします。これは自動プロパティで機能します。

他のすべてのメンバーをマークしなくても機能しますDataMember(これは常に面倒だと思います)。DataContract

于 2013-01-04T00:24:07.553 に答える