c# class events serialization serializable

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.