2010-03-05 13 views
16

Ich muss die Serialisierung eines Ereignisklassenmitglieds vermeiden, da die Serialisierung fehlschlägt, wenn das Ereignis von einem Objekt behandelt wird, das nicht als Serializable markiert ist.Wie ignoriert man Event-Klasse Mitglied für die binäre Serialisierung?

Ich habe versucht, das NonSerialized-Attribut für die Member der Event-Klasse, aber es kompiliert nicht. Diese Codezeile:

<NonSerialized()> Public Event PropertyValueChanged() 

erzeugt den folgenden Fehler:

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 

Gibt es eine andere Art und Weise Serialisierung Ereignis Mitglieder zu vermeiden?

Dies ist kein Problem, wenn das Ereignis nicht behandelt wird und ich umgehen kann, indem Sie die Objekte klonen (und das Ereignis ignorieren), bevor Sie sie serialisieren. Ich frage mich nur, ob es einen besseren Weg gibt.

Danke.

+0

@Paul - re "noch immer fehlgeschlagen"; was genau willst du machen? Ich frage mich, ob eine Änderung des Serialisierers hier eine gute Option wäre (es ist nicht so schwer wie es klingt und hat auch Seitenvorteile). Bis zu dir natürlich, aber ich kann über diesen Bereich für * Stunden sprechen * ... –

+0

@Marc: Danke für die Nachverfolgung. Ich muss einfach Ereignisse beim Serialisieren einer Klasse ignorieren, da die Serialisierung fehlschlägt, wenn das Ereignis mit einem Objekt verbunden ist, das nicht serialisierbar ist. Das NonSerialized-Attribut ist zwar sinnvoll, scheint aber in VB nicht so zu funktionieren wie in C# ... Ich erhalte einen Compiler-Fehler, selbst wenn ich ein Hintergrundfeld an eine öffentliche Ereigniseigenschaft anordne. Was meinen Sie, wenn Sie "den Serializer ändern" sagen? Meinst du benutzerdefinierte Serialisierung oder eine andere 3rd-Party-Bibliothek? –

Antwort

32

In C# können Sie dies wie folgt tun, so dass ich hoffe, dies übersetzt identisch mit VB.

Hinweis gilt dies nur Ereignisse artige Feld (dh wenn Sie nicht über Ihre eigenen add/remove):

[field: NonSerialized] 
public event EventType EventName; 

sonst so etwas wie:

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

+1 Ich hätte wissen müssen, dass es keine Möglichkeit gibt, dich zu schlagen, um diese Frage zu beantworten. – kemiller2002

+0

Nun, ich habe etwas Neues gelernt :) Schöne Lösung. – NebuSoft

+0

Leider keine Option übersetzt in VB ... –

5

es nicht funktioniert, weil der Compiler tatsächlich ein Hintergrundfeld für das Ereignis generiert. Um es zu aktivieren, das Präfix nur das Attribut mit dem Feld:

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

Dies funktioniert nicht für VB.NET aus irgendeinem Grund. –

0

Wie ich habe es in der Vergangenheit getan für Projekte ist es, die IXmlSerializable-Schnittstelle implementieren und meine Serialisierung manuell steuern. Ich finde, das macht das Serialisieren von GUI-basierten Steuerelementen (mit vielen Ereignissen) viel einfacher.

IXmlSerializable

+0

'IXmlSerializable' gilt nicht für die binäre Serialisierung.Es wäre 'ISerializable', was sehr unterschiedlich ist. –

+0

Ich habe verpasst, wo er es für Binary getaggt hat. Mein Fehler, aus irgendeinem Grund nahm ich an, dass er nach Xml fragte. – NebuSoft