Frage

Ich habe eine Klasse, die einen Verweis auf ein Hashtable maintans und serialisiert / deserialisiert dass Hashtable. Nach dem Aufruf von SerializationInfo.GetValue wird die Hashtable nicht vollständig deserialisiert, weil die Deserialisierung während der IDeserialization Calback passiert.

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

Ich implementierte auch den IDeserialization Rückruf in der übergeordneten Klasse, aber auch dort die Hashtable nicht vollständig deserialisiert noch. Ich erwartete, es zu sein, wenn die Deserialisierung von innen nach außen geschieht.

Meine Frage ist, ist es sicher Hashtable.OnDeserialization vom OnDeserialization Methode meiner Elternklasse explizit zu nennen, so dass ich es an dieser Stelle aufzählen kann?

public virtual void OnDeserialization(object sender)
{
    hashtable.OnDeserialization(sender);
}
War es hilfreich?

Lösung

Das ist wirklich eine interessante Frage. die Serialisierung Code mit Reflektor Nach der Überprüfung, denke ich, dass es keine allgemein gut soluiton ist, wenn eine genannte Klasse verwendet IDeserializationCallback.

Wahrscheinlich haben Sie gesehen, dass es zwei weitere Möglichkeiten, wie auch einige Codes während der Deserialisierung zu laufen, die [OnDeserializing] und die [OnDeserialized] Attribute. Unfortuanately läuft sowohl vor dem IDeserializationCallback.OnDeserialization (). Das ist der Lauf der Reihenfolge der Methoden, wenn Sie class1 haben, die zu einer Klasse 2 bezeichnet:

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 überprüft auch die OnDeserialization Implementierung von Hashtable und Wörterbuch, und beide scheint für den Aufruf des OnDeserialization mehr als einmal sicher zu sein (nur der erste Aufruf wird die notwendige Operation durchführen, werden die nachfolgenden Anrufe nichts tun wird).

So schließlich sollten Sie die OnDeserialization nennen () des Hashtable, wie Sean und Brian vorgeschlagen.

Andere Tipps

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

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

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

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top