Come ignorare evento membro della classe per la serializzazione binaria?
-
24-09-2019 - |
Domanda
Ho bisogno di evitare la serializzazione di un membro della classe di evento, perché quando l'evento viene gestito da un oggetto che non è contrassegnato come serializzabile fallirà la serializzazione.
Ho provato ad utilizzare l'attributo NonSerialized sul membro della classe di evento, ma non riesce a compilare. Questa riga di codice:
<NonSerialized()> Public Event PropertyValueChanged()
produce il seguente errore:
attributo 'NonSerializedAttribute' non può essere applicato a 'PropertyValueChanged' perché il attributo non è valido in questo tipo di dichiarazione.
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 lavorare intorno ad esso clonando gli oggetti (e ignorando l'evento) prima di serializzazione. Basta chiedersi se c'è un modo migliore.
Grazie.
Soluzione
In C # si può fare questo, come di seguito, in modo da speranza questo si traduce in modo identico a VB.
Si noti questo vale solo per campo come gli eventi (cioè dove non avete il vostro add
/ remove
):
[field: NonSerialized]
public event EventType EventName;
In caso contrario, qualcosa di simile a:
[NonSerialized]
EventType backingField;
public event EventType {
add { backingField += value; }
remove { backingField -= value; }
}
Altri suggerimenti
Non funziona perché il compilatore effettivamente genera un campo di supporto per l'evento. Per attivarlo, basta prefisso l'attributo con il campo:
[field: NonSerialized]
public event EventHandler PropertyValueChanged;
Come ho fatto in passato per i progetti è implementare l'interfaccia IXmlSerializable e controllare il mio serializzazione manualmente. Trovo questo rende la serializzazione di controlli GUI basata (con un sacco di eventi) molto più facile.