17

我需要避免序列化 Event 类成员,因为当事件由未标记为 Serializable 的对象处理时,序列化将失败。

我尝试在 Event 类成员上使用 NonSerialized 属性,但编译失败。这行代码:

<NonSerialized()> Public Event PropertyValueChanged()

产生以下错误:

属性“NonSerializedAttribute”不能应用于“PropertyValueChanged”,因为该属性在此声明类型上无效。

Public Event PropertyValueChanged() ' compiles but needs the extra handling described below

还有其他方法可以避免序列化 Event 成员吗?

如果未处理事件,这不是问题,我可以通过在序列化对象之前克隆对象(并忽略事件)来解决它。只是想知道是否有更好的方法。

谢谢。

4

3 回答 3

36

在 C# 中,您可以按如下方式执行此操作,因此我希望这与 VB 相同。

请注意,这仅适用于类似字段的事件(即您没有自己的add/ remove):

[field: NonSerialized]
public event EventType EventName;

否则类似:

[NonSerialized]
EventType backingField;
public event EventType {
    add { backingField += value; }
    remove { backingField -= value; }
}
于 2010-03-05T19:30:20.663 回答
6

它不起作用,因为编译器实际上为事件生成了一个支持字段。要启用它,只需在属性前面加上字段:

[field: NonSerialized]
public event EventHandler PropertyValueChanged;
于 2010-03-05T19:31:45.063 回答
0

我过去为项目所做的工作是实现 IXmlSerializable 接口并手动控制我的序列化。我发现这使得序列化基于 GUI 的控件(有很多事件)变得更加容易。

IXmlSerializable

于 2010-03-05T19:31:56.577 回答