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)
使用该[NonSerialized]属性可以避免事件的序列化。