Question

J'ai une classe qui maintient une référence à une table de hachage et sérialise / désérialise cette table de hachage. Après l'appel à SerializationInfo.GetValue, la table de hachage n'est pas complètement désérialisée car la désérialisation a lieu pendant le calback d'IDésérialisation.

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

J'ai également implémenté le rappel IDeserialization dans la classe parente, mais là aussi, la table de hachage n'est pas encore complètement désérialisée. Je m'attendais à ce qu'il en soit ainsi si la désérialisation se produit de l'intérieur.

Ma question est la suivante: est-il prudent d'appeler explicitement Hashtable.OnDeserialization à partir de la méthode OnDeserialization de ma classe parente, afin que je puisse l'énumérer à ce stade?

public virtual void OnDeserialization(object sender)
{
    hashtable.OnDeserialization(sender);
}
Était-ce utile?

La solution

C’est vraiment une question intéressante. Après avoir vérifié le code de sérialisation avec Reflector, je pense qu’il n’ya généralement aucune bonne solution si une classe référencée utilise IDeserializationCallback.

Vous avez probablement déjà vu qu'il existe deux autres manières d'exécuter du code pendant la désérialisation, les attributs [OnDeserializing] et [OnDeserialized]. Malheureusement, les deux fonctionnent avant IDeserializationCallback.OnDeserialization (). Ceci est l'ordre d'exécution des méthodes si vous avez class1 qui fait référence à une class2:

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

Comme vous pouvez le constater, les attributs [OnDeserializing] et [OnDeserialized] fonctionnent de manière cohérente, mais les méthodes IDeserializationCallback ne sont pas vraiment ...: (

J'ai également vérifié l'implémentation de Hashtable et de Dictionary avec OnDeserialization, et les deux semblent sécuritaires pour appeler plusieurs fois OnDeserialization (seul le premier appel effectuera l'opération nécessaire, les appels suivants ne feront rien).

Pour finir, vous devriez appeler OnDeserialization () de la table de hachage, comme suit: Sean , a suggéré Brian.

Autres conseils

Je pense que vous avez déjà cherché sur Google, mais il m'est arrivé de passer à travers ce modèle hier.

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

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

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top