为什么[NonSerialized]不能处理自动实现的属性?

时间:2010-09-21 13:40:28

标签: .net .net-3.5 serialization nonserializedattribute

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

为什么不允许这样做?

我知道诸如

之类的解决方法
  • 实施ISerializable
  • 切换到XmlSerializer / XmlIgnore
  • 切换到手动实施的属性

问题特别是 为什么不允许[NonSerialized],但允许在字段上使用

3 个答案:

答案 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