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.

È stato utile?

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.

IXmlSerializable

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top