2008-11-10 1 views
10

Ich habe eine Klasse, die eine Referenz auf eine Hashtabelle verwaltet und diese Hashtable serialisiert/deserialisiert. Nach dem Aufruf von SerializationInfo.GetValue wird die Hashtable nicht vollständig deserialisiert, da die Deserialisierung während des IDeserialization-Calback erfolgt.Hashtable.OnDeserialization

Hashtable hashtable = (Hashtable) info.GetValue("hash", typeof(Hashtable)); 

ich implementiert auch den IDeserialization Rückruf in der übergeordneten Klasse, aber auch dort die Hashtable noch nicht vollständig deserialisiert werden. Ich habe es erwartet, wenn die Deserialisierung von innen heraus geschieht.

Meine Frage ist, ist es sicher, Hashtable.OnDeserialization von der OnDeserialization-Methode meiner Elternklasse explizit aufzurufen, damit ich es an diesem Punkt aufzählen kann?

+0

Dies ist ein interessantes Problem. Sie können immer einige Haltepunkte setzen und sehen, was passiert. –

+0

Ich habe ein ähnliches Problem in der generischen Dictionary-Sammlung mit Microsoft Connect angesprochen. Sie haben bestätigt, dass es sich um einen Fehler handelt. Ich habe es nie direkt OnDeserialization versucht, aber ich vermute, dass es nicht in allen Situationen funktioniert. –

Antwort

5

Dies ist wirklich ein interessantes Thema. Nach dem Überprüfen des Serialisierungscodes mit Reflector denke ich, dass es keine allgemein gute Lösung gibt, wenn eine referenzierte Klasse IDeserializationCallback verwendet.

Wahrscheinlich haben Sie gesehen, dass es zwei weitere Möglichkeiten gibt, Code während der Deserialisierung auszuführen, die Attribute [OnDeserializing] und [OnDeserialized]. Leider läuft beides vor der IDeserializationCallback.OnDeserialization(). Das ist der Lauf der Reihenfolge der Methoden, wenn Sie class1 haben, die zu einer Klasse 2 bezieht:

Class1: [OnDeserializing] 
Class2: [OnDeserializing] 
Class2: [OnDeserialized] 
Class1: [OnDeserialized] 
Class1: IDeserializationCallback.OnDeserialization 
Class2: IDeserializationCallback.OnDeserialization 

Wie Sie sehen können, die [OnDeserializing] und die [OnDeserialized] Attribute arbeiten konsistent, aber die IDeserializationCallback Methoden nicht wirklich. .. :(

ich habe auch die OnDeserialization Implementierung von Hashtable und Wörterbuch überprüft, und beide scheinen für den Aufruf das OnDeserialization mehr als einmal (nur der erste Anruf wird führt die notwendige Operation, sicher zu sein, werden die nachfolgenden Anrufe nichts tun)

So endlich sollten Sie die OnDeserialization() von aufrufen die Hashtable, wie Sean und Brian vorgeschlagen.

3

Ich vermute, Sie haben bereits gegoogelt, aber ich zufällig gestern über this Muster.

public BoringClass(SerializationInfo info, StreamingContext context) 
{ 
    Hashtable hashtable = (Hashtable) info.GetValue("hash", typeof(Hashtable)); 
    hashtable.OnDeserialization(this); 

    Console.WriteLine("Value is: " + hashtable["testItem"]); 

} 
+0

Gute Idee, das hilft bei einem ähnlichen Problem, das ich hatte. Sie müssen sicherstellen, dass OnDeserialization sicher zweimal aufgerufen werden kann. –