【问题标题】:Why do I need "field:" in my attribute declaration "[field:NonSerialized]"?为什么我的属性声明“[field:NonSerialized]”中需要“field:”?
【发布时间】:2011-01-02 13:59:46
【问题描述】:

我在任何地方都找不到列为 C# 关键字的“字段”。有人知道这方面的背景吗?

【问题讨论】:

  • 你能多贴一点代码吗?您在哪里尝试创建新属性,或者您是在某处应用该属性。更多上下文会有所帮助。
  • 我忘记了这些。我更新了 C# 关键字列表以包含它们。谢谢!详情请见blogs.msdn.com/ericlippert/archive/2009/05/11/…

标签: c# .net serialization nonserializedattribute


【解决方案1】:

NonSerializedAttribute 只适用于字段,可以如下使用:

[NonSerialized]
public string myString;

【讨论】:

    【解决方案2】:

    这是必需的,例如,如果您将事件标记为不可序列化。它指定属性应用到的目标。

    它是属性目标语法的一部分。来自specification

    attribute-target:
        field
        event
        method
        param
        property
        return
        type
    

    另请参阅NonSerializedAttribute 的文档:

    要将NonSerializedAttribute 类应用于事件,请将属性位置设置为字段,如以下 C# 代码所示。

    [field:NonSerializedAttribute()]

    public event ChangedEventHandler Changed;

    【讨论】:

    • 嗯,你不能序列化一个事件,而且 NonSerializedAttribute 只适用于字段,所以我不明白 [field:NonSerializedAttribute()] 是做什么的,我也很惊讶它编译。
    • 重点是订阅事件的对象会被认为是对象图的一部分,在包含事件的对象被序列化时会被序列化。为了防止它们被序列化,您必须使用NonSerializedAttribute 将事件归因于。但由于NonSerializedAttribute 仅适用于字段,因此您必须使用属性目标field 对其进行标记。
    • Yuriy,我相信委托被编译成类,在这种情况下,当它序列化它时,它们会使用它们的调用列表进行序列化。在这种情况下,您需要将其设置为 [NonSerialized] 但是它会引发编译错误,因此您需要指定字段:NonSerialized。我认为他们在 .NET 3.5 中修复了它
    • @Jason 我刚刚使用了 XML 序列化器,但事件没有序列化。
    • 我可以看到 EventHandler 类是如何被标记为可序列化的,我怎样才能为事件重现这种行为?
    【解决方案3】:

    这是为了让您可以在字段上设置 NonSerialized 属性,这在序列化事件时很有用。

    例如,这会给你一个编译错误

    [NonSerialized]
    public event SomeEventHandler SomeEvent;
    

    要解决此问题,您必须使用 field:

    [field:NonSerialized]
    public event SomeEventHandler SomeEvent;
    

    更多信息在这里 -- Delegates and Serialization

    【讨论】:

    • 但是您将其标记为 NonSerialized,并且事件无法序列化。
    • Yuriy,我相信 .NET 3.0 事件/委托可以序列化为类,因此您必须将它们指定为 NonSerialized
    • 你是对的。我使用 XmlSerializer 来序列化没有事件序列化的类。但是 BinaryFormatter 很好。
    【解决方案4】:

    C# 编译器通常可以毫不费力地确定属性适用于声明的哪一部分。我可以想到三种你可能会用到它的情况:

    1. 应用于程序集的属性。在 AssemblyInfo.cs 中非常明显
    2. 应用于 P/Invoke 声明的返回值的属性,[return:MarshalAs]
    3. 在没有访问器的情况下将属性应用于属性或事件的支持变量。你的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多