c# - Serialización de una clase con eventos.
class events (4)
Tengo una clase como esta:
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;
}
También tengo otra clase (StepPulseblaster) que no es serializable y agrega un controlador de eventos
valDouble.Changed += new ChangedEventHandler(sc_PropertyChanged);
Cuando intento serializar la clase valueDouble, habrá un error:
The Type StepPulseblaster is not marked as serializable
Cuando comento la linea
valDouble.Changed += ...
No habrá más error.
¿Cómo puedo serializar una clase que tiene algunos eventos conectados?
Deberías hacer:
[field: NonSerialized]
public event ChangedEventHandler Changed;
Como se describe en los documentos :
En el caso de eventos, también debe agregar el calificador de atributo de campo cuando aplique el atributo Sin serializar para que el atributo se aplique al delegado subyacente en lugar de al evento en sí:
El atributo No serializado solo está disponible para los campos, por lo que para usarlo debe ajustar su código para usar los campos.
Intenta crear tu evento de esta manera:
[NonSerialized]
private ChangedEventHandler _changed;
public event ChangedEventHandler Changed
{
add { _changed += value; }
remove { _changed -= value; }
}
Luego, en la propiedad de valor use el campo, no la propiedad:
public double value
{
get { return _value; }
set
{
_value = value;
if (_changed != null)
{
_changed(this, EventArgs.Empty);
}
}
}
private double _value = 0;
Marque StepPulseBlaster como serializable o use el atributo XmlIgnore para evitar que Changed se serialice.
Utilice el atributo [NonSerialized]
para evitar la serialización del evento.