21

我有一个这样的课程:

public delegate void ChangedEventHandler(object sender, EventArgs e);
[Serializable]
public class valueDouble
{
    public event ChangedEventHandler Changed;
    public double value
    {
        get { return _value; }
        set 
        {
            _value = value;
            if (Changed != null)
            {
                Changed(this, EventArgs.Empty);
            }
        }
    }
    private double _value = 0;
}

我还有另一个不可序列化的类(StepPulseblaster)并添加了一个事件处理程序

valDouble.Changed += new ChangedEventHandler(sc_PropertyChanged);

当我尝试序列化 valueDouble 类时,会出现错误:

The Type StepPulseblaster is not marked as serializable

当我评论该行时

valDouble.Changed += ...

不会再有错误了。

我如何序列化一个连接了一些事件的类?

4

4 回答 4

31

你应该做:

[field: NonSerialized]
public event ChangedEventHandler Changed;

MSDN中所述:

要将 NonSerializedAttribute 类应用于事件,请将属性 location 设置为field

于 2015-05-27T13:23:05.197 回答
13

NonSerialized 属性仅适用于字段,因此要使用它,您必须调整代码以使用字段。

尝试像这样创建您的活动:

[NonSerialized]
private ChangedEventHandler _changed;
public event ChangedEventHandler Changed
{
    add { _changed += value; }
    remove { _changed -= value; }
}

然后在 value 属性中使用字段,而不是属性:

public double value
{
    get { return _value; }
    set 
    {
        _value = value;
        if (_changed != null)
        {
            _changed(this, EventArgs.Empty);
        }
    }
}
private double _value = 0;
于 2013-05-14T14:24:15.267 回答
1

要么将 StepPulseBlaster 标记为可序列化,要么使用 XmlIgnore 属性来防止 Changed 被序列化。

于 2012-05-30T13:19:15.123 回答
1

使用该[NonSerialized]属性来避免事件的序列化。

于 2012-05-30T13:15:40.733 回答