2010-03-05 15 views
16

È necessario evitare di serializzare un membro della classe Event perché quando l'evento viene gestito da un oggetto che non è contrassegnato come serializzabile, la serializzazione avrà esito negativo.Come ignorare il membro della classe Event per la serializzazione binaria?

Ho provato a utilizzare l'attributo NonSerialized sul membro della classe Event ma non riesce a compilare. Questa riga di codice:

<NonSerialized()> Public Event PropertyValueChanged() 

produce il seguente errore:

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 

C'è un altro modo per evitare la serializzazione membri evento?

Questo non è un problema se l'evento non viene gestito e posso aggirarlo clonando gli oggetti (ignorando l'evento) prima di serializzarli. Mi chiedo solo se c'è un modo migliore.

Grazie.

+0

@Paul - re "fallisce ancora"; cosa vuoi fare esattamente? Mi chiedo se cambiando serializzatore sarebbe una buona opzione qui (non è così difficile come sembra, e ha anche vantaggi collaterali). Naturalmente, ma posso parlare di quest'area per * ore * ... –

+0

@Marc: Grazie per il seguito. Devo semplicemente ignorare gli eventi durante la serializzazione di una classe poiché la serializzazione non riesce quando l'evento è collegato a un oggetto che non è serializzabile. L'attributo NonSerialized ha senso, ma non sembra funzionare allo stesso modo in VB come in C# ... Ottengo un errore del compilatore anche quando decoro un campo di supporto per una proprietà di un evento pubblico. Cosa intendi quando dici "cambiare il serializzatore"? Vuoi dire serializzazione personalizzata o qualche altra libreria di terze parti? –

risposta

32

In C# è possibile eseguire questa operazione come indicato di seguito, quindi I speranza si traduce in modo identico in VB.

Nota questo vale solo di mettere in campo simili eventi (cioè dove non si ha il proprio add/remove):

[field: NonSerialized] 
public event EventType EventName; 

Altrimenti qualcosa di simile:

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

+1 Avrei dovuto sapere che non c'era modo di batterti per rispondere a questa domanda. – kemiller2002

+0

Beh, ho imparato qualcosa di nuovo :) Bella soluzione. – NebuSoft

+0

Sfortunatamente nessuna delle due opzioni si traduce in VB ... –

5

Non è funziona perché il compilatore genera effettivamente un campo di supporto per l'evento. Per attivarlo, basta prefisso l'attributo con il campo:

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

Questo non funziona per VB.NET per qualche motivo. –

0

Come ho fatto in passato per i progetti è implementare l'interfaccia IXmlSerializable e controllare il mio serializzazione manualmente. Trovo che questo semplifica notevolmente la serializzazione dei controlli basati su GUI (con molti eventi).

IXmlSerializable

+0

'IXmlSerializable' non si applica alla serializzazione binaria.Sarebbe 'ISerializable', che è molto diverso. –

+0

Mi è mancato dove l'ha taggato per Binary. Il mio errore, per qualche motivo ho pensato che stesse chiedendo Xml. – NebuSoft