C# 为什么我需要“我需要”;字段:";“在我的属性声明中”;[字段:非序列化]”;?
我在任何地方都找不到作为C#关键字列出的“字段”。有人知道这方面的背景吗?非序列化属性仅适用于字段,您可以按如下方式使用它:C# 为什么我需要“我需要”;字段:";“在我的属性声明中”;[字段:非序列化]”;?,c#,.net,serialization,nonserializedattribute,C#,.net,Serialization,Nonserializedattribute,我在任何地方都找不到作为C#关键字列出的“字段”。有人知道这方面的背景吗?非序列化属性仅适用于字段,您可以按如下方式使用它: [NonSerialized] public string myString; 例如,如果要将事件标记为不可序列化,则这是必需的。它指定属性应用于的目标 它是属性目标语法的一部分。从: 另请参见以下文档: 要将NonSerializedAttribute类应用于事件,请将属性location设置为field,如下面的C#code所示 [字段:NonSerializedA
[NonSerialized]
public string myString;
例如,如果要将事件标记为不可序列化,则这是必需的。它指定属性应用于的目标 它是属性目标语法的一部分。从: 另请参见以下文档: 要将
NonSerializedAttribute
类应用于事件,请将属性location设置为field,如下面的C#code所示
[字段:NonSerializedAttribute()]
公共事件变更事件处理程序变更代码>
这意味着允许您在字段上设置非序列化属性,这在序列化事件时非常有用
例如,这会给您一个编译错误
[NonSerialized]
public event SomeEventHandler SomeEvent;
要解决此问题,您必须使用字段:
[field:NonSerialized]
public event SomeEventHandler SomeEvent;
这里有更多信息--C#编译器通常可以毫不费力地确定属性应用于声明的哪一部分。我可以想到三种情况,您可以使用它:
应用于程序集的属性。在AssemblyInfo.cs中非常可见
应用于P/Invoke声明返回值的属性,[返回:marshallas]
将属性应用于不带访问器的属性或事件的支持变量。你的案子
你能多发一点代码吗?您正在尝试在何处创建新属性,或者在何处应用该属性。更多的上下文会有帮助。我忘了这些。我已经更新了我的C#关键字列表,将其包括在内。谢谢有关详细信息,请参阅。您无法序列化事件,并且NonSerializedAttribute仅适用于字段,因此我不理解[field:NonSerializedAttribute()]的作用,我还对它的编译感到惊讶。关键是订阅事件的对象将被视为对象图的一部分,并在序列化包含事件的对象时被序列化。要防止它们被序列化,必须使用NonSerializedAttribute
将事件属性化。但是由于NonSerializedAttribute
仅适用于字段,因此必须使用属性targetfield
对其进行标记。Yuriy,我认为委托被编译成类,在这种情况下,当委托被序列化时,委托会使用其调用列表进行序列化。在这种情况下,您需要将其设置为[NonSerialized],但它会引发编译错误,因此您需要指定field:NonSerialized。我想他们在.NET3.5中修复了它however@Jason我刚刚使用了一个XML序列化程序,但事件没有序列化。我可以看到EventHandler类如何标记为可序列化,如何为事件重现此行为?但是您将其标记为非序列化,并且事件无法序列化。Yuriy,我相信.NET3.0中的事件/委托是可序列化为类的,因此您必须将它们指定为非序列化的,请查看以下链接,您是正确的。我使用XmlSerializer来序列化该类,该类没有事件序列化。但是二进制格式化程序可以使用它。
[field:NonSerialized]
public event SomeEventHandler SomeEvent;