【问题标题】:Why doesn't [NonSerialized] work on autoimplemented properties?为什么 [NonSerialized] 不适用于自动实现的属性?
【发布时间】:2011-04-15 05:21:31
【问题描述】:
[Serializable]
class MyClass
{
    [NonSerialized] int Foo { get; set; } // error
    [NonSerialized] int bar; // ok
}

为什么不允许这样做?

我知道一些解决方法,例如

  • 实现 ISerializable
  • 切换到 XmlSerializer/XmlIgnore
  • 切换到手动实现的属性

问题具体是为什么在属性上不允许[NonSerialized],但在字段上却允许。

【问题讨论】:

    标签: .net .net-3.5 serialization nonserializedattribute


    【解决方案1】:

    我认为这是一个需要您付出更多努力的细粒度控制案例。换句话说,默认情况下,自动属性将具有可序列化的支持字段。如果您想要除默认值以外的任何内容,则不能使用自动属性。

    我曾认为对属性使用[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】:

      属性实际上是方法,它们不是由二进制序列化过程序列化的。它是被序列化的字段。所以只有在字段上指定NonSerialized 才有意义。

      【讨论】:

      • 属性不仅仅是方法。从语义上讲,它们是方法和隐式支持字段的组合。并且所有现有的序列化程序都看到了支持字段。因此,通过其属性控制隐式支持字段的序列化是有意义的。
      • 确实,它们实际上是一对方法。但是支持字段仅对自动属性是隐式的,对于普通属性可能根本不存在。无论如何,当 NonSerialized 属性被引入时,自动属性并不存在,所以他们不可能考虑到这一点
      • 好的,如果他们要让 NonSerialized 对属性 now 有效,他们必须区分 AttributeTargets 枚举中的自动属性和普通属性。我相信如果不破坏兼容性就无法做到这一点。接受。
      【解决方案3】:

      如果您使用 WCF,您可能需要查看 IgnoreDataMemberAttribute。这适用于自动属性。

      即使您没有将所有其他成员都标记为 DataMember(我总是觉得这很痛苦)并且使用 DataContract 的班级也可以工作

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-30
        • 2011-12-28
        • 2011-12-03
        • 2020-03-09
        • 1970-01-01
        • 1970-01-01
        • 2022-08-07
        • 2010-12-31
        相关资源
        最近更新 更多