6


0

自動実装されたプロパティで[NonSerialized]が機能しないのはなぜですか?
[Serializable]
class MyClass
{
    [NonSerialized] int Foo { get; set; } // error
    [NonSerialized] int bar; // ok
}

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

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

  • ISerializableの実装

  • XmlSerializer / XmlIgnoreへの切り替え

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

質問は、特に_why_は[NonSerialized]プロパティでは許可されていませんが、フィールドでは許可されています。

3 Answer


12


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


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; } }
}

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


0


WCFを使用している場合は、http://msdn.microsoft.com/en-us/library/system.runtime.serialization.ignoredatamemberattribute.aspx [IgnoreDataMemberAttribute]をご覧ください。 これは自動プロパティで機能します。

他のすべてのメンバーを「DataMember」(私はいつも苦痛だと思う)および「DataContract」のクラスとしてマークしなくても機能します