使用事件序列化类

Ste*_*ein 20 c# events serialization class serializable

我有一个这样的类:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

valDouble.Changed += new ChangedEventHandler(sc_PropertyChanged);
Run Code Online (Sandbox Code Playgroud)

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

The Type StepPulseblaster is not marked as serializable
Run Code Online (Sandbox Code Playgroud)

当我评论这条线

valDouble.Changed += ...
Run Code Online (Sandbox Code Playgroud)

不会再有任何错误了.

如何序列化连接了某些事件的类?

Joh*_*son 30

你应该做:

[field: NonSerialized]
public event ChangedEventHandler Changed;
Run Code Online (Sandbox Code Playgroud)

文档所述:

对于事件,还必须在应用NonSerialized属性时添加字段属性限定符,以便将属性应用于基础委托而不是事件本身:


Tom*_*try 13

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

尝试创建这样的事件:

[NonSerialized]
private ChangedEventHandler _changed;
public event ChangedEventHandler Changed
{
    add { _changed += value; }
    remove { _changed -= value; }
}
Run Code Online (Sandbox Code Playgroud)

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

public double value
{
    get { return _value; }
    set 
    {
        _value = value;
        if (_changed != null)
        {
            _changed(this, EventArgs.Empty);
        }
    }
}
private double _value = 0;
Run Code Online (Sandbox Code Playgroud)


cde*_*del 1

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

  • 在 VS2010 中,将 [NonSerialized] 应用于事件会出现错误:“错误 2 属性‘NonSerialized’在此声明类型上无效。它仅在‘字段’声明上有效。” (2认同)