なぜ[非文字化]は自動化されたプロパティで機能しないのですか?
-
04-10-2019 - |
質問
[Serializable]
class MyClass
{
[NonSerialized] int Foo { get; set; } // error
[NonSerialized] int bar; // ok
}
なぜこれが許可されていないのですか?
私は次のような回避策について知っています
- iSerializableの実装
- XmlSerializer/Xmlignoreへの切り替え
- 手動で実装されたプロパティに切り替えます
質問は具体的です どうして 非文字化]は、適切なものに許可されていますが、フィールドで許可されています。
解決
プロパティは実際には方法であり、バイナリシリアル化プロセスによってシリアル化されていません。それはシリアル化されたフィールドです。したがって、指定するのは理にかなっています NonSerialized
フィールドで。
他のヒント
これは、あなたの側でより多くの努力を必要とする細かい制御の場合だと思います。言い換えれば、自動プロパティにはデフォルトでシリアル化可能なバッキングフィールドがあります。デフォルト以外のものが必要な場合は、自動プロパティを使用できません。
私はそれを使用していたと思っていました [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; } }
}
したがって、バッキングフィールドはシリアル化可能です(デフォルト)。
あなたは見たいかもしれません IgnoreDataMemberAttribute
WCFを使用している場合。これは、自動プロパティで機能します。
他のすべてのメンバーを次のようにマークしなくても機能します DataMember
(私はいつも痛みであると感じています)とクラス DataContract
所属していません StackOverflow