with values through loop keys from example array c# serialization hashtable ideserializationcallback

c# - values - hashtable using



Hashtable.OnDeserialization (2)

Sospecho que ya habías buscado en Google, pero ayer pasé por este patrón.

public BoringClass(SerializationInfo info, StreamingContext context) { Hashtable hashtable = (Hashtable) info.GetValue("hash", typeof(Hashtable)); hashtable.OnDeserialization(this); Console.WriteLine("Value is: " + hashtable["testItem"]); }

Tengo una clase que mantiene una referencia a un Hashtable y serializa / deserializa ese Hashtable. Después de la llamada a SerializationInfo.GetValue, la Hashtable no se ha deserializado por completo debido a que la deserialización ocurre durante la calibración de IDeserialization.

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

También implementé la devolución de llamada IDeserialization en la clase principal, pero también la Hashtable aún no está totalmente deserializada. Esperaba que fuera si la deserialización sucedía de adentro hacia afuera.

Mi pregunta es: ¿es seguro llamar explícitamente a Hashtable.OnDeserialization del método OnDeserialization de mi clase padre, para que pueda enumerarlo en ese punto?

public virtual void OnDeserialization(object sender) { hashtable.OnDeserialization(sender); }


Este es realmente un tema interesante. Después de verificar el código de serialización con Reflector, creo que no hay una solución generalmente buena si una clase referida usa IDeserializationCallback.

Probablemente haya visto que hay otras dos maneras de ejecutar algún código durante la deserialización, los atributos [OnDeserializing] y [OnDeserialized]. Desafortunadamente, ambos se ejecutan antes de IDeserializationCallback.OnDeserialization (). Este es el orden de ejecución de los métodos si tiene clase1 que se refiere a una clase2:

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

Como puede ver, los atributos [OnDeserializing] y [OnDeserialized] funcionan de forma coherente, pero los métodos IDeserializationCallback no son realmente ... :(

También he comprobado la implementación OnDeserialization de Hashtable y Dictionary, y parece que ambos son seguros para llamar a OnDeserialization más de una vez (solo la primera llamada realizará la operación necesaria, las llamadas subsiguientes no harán nada).

Así que, finalmente, debes llamar a OnDeserialization () de la Hashtable, como sugirieron Sean y Brian.