Pregunta

Tengo una clase que mantiene una referencia a un Hashtable y serializa / deserializa ese Hashtable. Después de la llamada a SerializationInfo.GetValue, el Hashtable no está completamente deserializado porque la deserialización ocurre durante la devolución de llamada de IDeserialización.

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

También implementé la devolución de llamada de IDeserialización en la clase padre, pero allí también el Hashtable aún no está completamente deserializado. Esperaba que fuera así si la deserialización ocurre de adentro hacia afuera.

Mi pregunta es, ¿es seguro llamar explícitamente a Hashtable.OnDeserialization desde el método OnDeserialization de mi clase principal, para poder enumerarlo en ese punto?

public virtual void OnDeserialization(object sender)
{
    hashtable.OnDeserialization(sender);
}
¿Fue útil?

Solución

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

Probablemente haya visto que también hay otras dos formas de ejecutar código durante la deserialización, los atributos [OnDeserializing] y [OnDeserialized]. Desafortunadamente, ambas 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 manera consistente, pero los métodos IDeserializationCallback no son realmente ... :(

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

Entonces, finalmente debe llamar a OnDeserialization () de Hashtable, como Sean y Brian sugirieron.

Otros consejos

Sospecho que ya has buscado en Google, pero me encontré con este patrón ayer.

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

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

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top