[Serializable]
class MyClass
{
[NonSerialized] int Foo { get; set; } // error
[NonSerialized] int bar; // ok
}
为什么不允许这样做?
我知道诸如
之类的解决方法问题特别是 为什么不允许[NonSerialized],但允许在字段上使用
。答案 0 :(得分:12)
属性实际上是方法,它们不是由二进制序列化过程序列化的。这是序列化的字段。因此,仅在字段上指定NonSerialized
是有意义的。
答案 1 :(得分: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; } }
}
因此,支持字段是可序列化的(默认值)。
答案 2 :(得分:0)
如果您使用的是WCF,可能需要查看IgnoreDataMemberAttribute
。这适用于自动属性。
即使您没有将所有其他成员标记为DataMember
(我总是觉得很痛苦),而且标记为DataContract