Warum ist BinaryFormatter versucht zu serialisieren, die ein Ereignis auf eine Serialisierbare Klasse?
Ich habe eine einfache Klasse wird als Serialisierbar markiert, und es passiert ein Ereignis. Ich habe versucht, zu diesem Anlass Mitglied als NonSerialized, aber der compiler meckert. Doch wenn ich zum serialisieren der Klasse-Instanz der BinaryFormatter wirft eine Ausnahme, die Veranstaltung ist nicht serialisierbar. Bedeutet das, dass Sie nicht serialisieren von Klassen, die Ereignisse? Wenn dem so ist, dann sollte der compiler so zu sagen nach vorne.
Stream file = File.Open("f", FileMode.Open);
BinaryFormatter bf = new BinaryFormatter();
object obj = null;
try
{
obj = bf.Deserialize(file);
}
catch (System.Runtime.Serialization.SerializationException e)
{
MessageBox.Show("De-Serialization failed : {0}", e.Message);
}
file.Close();
System.Collections.ArrayList nodeList = obj as System.Collections.ArrayList;
foreach (TreeNode node in nodeList)
{
treeView.Nodes.Add(node);
}
Nicht funktioniert auf die folgende Klasse:
[Serializable()]
class Simple
{
private int myInt;
private string myString;
public event SomeOtherEventDefinedElsewhere TheEvent;
}
- Können Sie erklären, ein wenig mehr über das, was Sie zu tun versuchen, und vielleicht geben uns einen kleinen code-snippet?
- Sicher. Ich habe nur diese Klasse, hat sich vor allem string-und int-Eigenschaften. Aber es hat ein paar Ereignisse zu informieren, die Verbraucher, wenn die Instanzen ändern. Ich bin die Speicherung von Instanzen dieser Klasse in der Eigenschaft " Tag " ein .NET TreeView-Klasse, oder genauer gesagt, in jedem Tag-Eigenschaft jedes TreeNode-Objekt entspricht, das Objekt. Wenn ich versuche zu serialisieren, die das TreeView-auf Festplatte (Speicherung jeder Knoten in einer ArrayList und dann schriftlich aus der Liste), bekomme ich eine exception: "der Typ 'MyEventSubscriber' in Assembly MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null " ist nicht als serialisierbar markiert."
- cont... MyEventSubscriber passiert, werden die class-Instanz des Abonnenten für das event auf der Klasse, die ich bin versucht zu serialisieren (die, die in der Tag-Eigenschaft des TreeNode -).
- Bitte Bearbeiten Sie die ursprüngliche Frage (die Sie dann verwenden können, formatieren) auch, wir wirklich brauchen, um sehen, einige der code, bitte machen Sie einen einfachen Fall, der zeigt das problem.
- "Ich habe versucht, markieren Sie den Ereignis-Mitglied als NonSerialized, aber der compiler meckert". Welche Fehler haben Sie?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Präfix der
NonSerializedAttribute
mit Feld[field:Attribute]
syntax. Ersparte mir einiges an Tipparbeit.Es ist wichtig, daran zu erinnern, dass das Attribut
[Field:NonSerialized]
angewendet wird, um die Delegierten, nicht die Ereignisse von groß-und Kleinschreibung durch die Art und Weise, dann implementieren Sie eine ISerializable-Objekt, und mit Reflexion Durchlaufen die Klasse, die Sie serialisieren, auf der Suche nach den event-handler, und kündigen die ersten Veranstaltungen vor der Serialisierung. Dann bei der Deserialisierung können Sie dann verdrahten Sie die Ereignisse, wenn notwendig, automatisch auf Deserialisieren...Ich weiß, das ist ein verspäteter post, aber hier ist eine tatsächliche Antwort auf diese Frage. Erstellen Sie manuelle hinzufügen/entfernen "Getter/setter" für Ihre Veranstaltung (der compiler erledigt dies für Sie hinter die kulissen, aber in diesem Fall müssen Sie dies explizit), dann markieren Sie Ihre Veranstaltung als NonSerialized. Ich habe nicht die Zeit zu brechen, den code für Sie, aber eine schnelle Suche zeigt, jemand lief in das gleiche Problem :
http://sanity-free.org/113/csharp_binary_serialization_oddities.html
Verwenden Sie nicht diese Linie jedoch : [MethodImpl(MethodImplOptions.Synchronized)]
Dies führt zu einer thread-safety-Probleme wurde behoben, C# 4, siehe :
http://blogs.msdn.com/b/cburrows/archive/2010/03/05/events-get-a-little-overhaul-in-c-4-part-i-locks.aspx
Müssen Sie die Rolle Ihrer eigenen lockless alternative (mit CAS) oder die online-Suche nach einem; leider habe ich nicht die Zeit haben, so habe ich zu laufen, aber Sie bekommen die Idee.
Hoffe, das hilft!