2010-03-05 10 views
16

Necesito evitar serializar un miembro de clase de evento porque cuando el evento es manejado por un objeto que no está marcado como Serializable, la serialización fallará.¿Cómo ignorar miembro de la clase de evento para la serialización binaria?

Intenté utilizar el atributo NonSerialized en el miembro de la clase Event pero no se puede compilar. Esta línea de código:

<NonSerialized()> Public Event PropertyValueChanged() 

produce el siguiente error:

Attribute 'NonSerializedAttribute' cannot be applied to 'PropertyValueChanged' because the attribute is not valid on this declaration type.

Public Event PropertyValueChanged() ' compiles but needs the extra handling described below 

¿Hay otra manera de evitar la serialización de los miembros de eventos?

Esto no es un problema si el evento no se maneja y puedo evitarlo clonando los objetos (e ignorando el evento) antes de serializarlos. Me pregunto si hay una mejor manera.

Gracias.

+0

@Paul - re "still fails"; ¿Qué es exactamente lo que quieres hacer? Me pregunto si cambiar el serializador sería una buena opción aquí (no es tan difícil como parece, y tiene beneficios secundarios también). Depende de usted, por supuesto, pero puedo hablar sobre esta área durante * horas * ... –

+0

@Marc: gracias por darme seguimiento. Simplemente necesito ignorar los eventos al serializar una clase ya que la serialización falla cuando el evento está conectado a un objeto que no es serializable. El atributo NonSerialized tiene sentido, pero no parece funcionar de la misma manera en VB que en C# ... Recibo un error de compilación incluso cuando decorar un campo de respaldo a una propiedad de evento público. ¿A qué te refieres cuando dices "cambiar el serializador"? ¿Te refieres a serialización personalizada o alguna otra biblioteca de terceros? –

Respuesta

32

En C# puede hacer esto como a continuación, por lo que espero que se traduzca de manera idéntica a VB.

Nota esto sólo se aplica a campo-como eventos (es decir, cuando usted no tiene su propio add/remove):

[field: NonSerialized] 
public event EventType EventName; 

De lo contrario algo como:

[NonSerialized] 
EventType backingField; 
public event EventType { 
    add { backingField += value; } 
    remove { backingField -= value; } 
} 
+0

+1 Debí haber sabido que no iba a haber manera de vencerlo para contestar esta pregunta. – kemiller2002

+0

Bueno, aprendí algo nuevo :) Buena solución. – NebuSoft

+0

Desafortunadamente ninguna de estas opciones se traduce a VB ... –

5

No es funcionando porque el compilador realmente genera un campo de respaldo para el evento. Para activarlo, simplemente prefijar su atributo con el campo:

[field: NonSerialized] 
public event EventHandler PropertyValueChanged; 
+0

Esto no funciona para VB.NET por algún motivo. –

0

Cómo lo he hecho en el pasado para los proyectos es implementar la interfaz IXmlSerializable y controlar mi serialización de forma manual. Encuentro que esto hace que la serialización de controles basados ​​en la GUI (con muchos eventos) sea mucho más fácil.

IXmlSerializable

+0

'IXmlSerializable' no se aplica a la serialización binaria.Sería 'ISerializable', que es muy diferente. –

+0

Eché de menos dónde lo etiquetó para Binario. Mi error, por alguna razón, supuse que estaba pidiendo Xml. – NebuSoft

Cuestiones relacionadas