Hashtable.OnDeserialization

У меня есть класс, который поддерживает ссылку на Hashtable и сериализует/десериализует Hashtable. После вызова SerializationInfo.GetValue, Hashtable не полностью десериализован, потому что десериализация происходит во время возврата идентификатора.

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

Я также реализовал обратный вызов IDeserialization в родительском классе, но там Hashtable еще не полностью десериализован. Я ожидал, что это произойдет, если десериализация произойдет изнутри.

Мой вопрос в том, можно ли явно вызвать Hashtable.OnDeserialization из метода OnDeserialization моего родительского класса, чтобы я мог перечислить его в этой точке?

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

Ответ 1

Это действительно интересная проблема. После проверки кода сериализации с Reflector, я думаю, что вообще нет хорошего soluiton, если упомянутый класс использует IDeserializationCallback.

Вероятно, вы видели, что есть два других способа запустить некоторый код во время десериализации, атрибуты [OnDeserializing] и [OnDeserialized]. К сожалению, оба выполняются до IDeserializationCallback.OnDeserialization(). Это порядок выполнения методов, если у вас есть класс1, который ссылается на класс2:

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

Как вы можете видеть, атрибуты [OnDeserializing] и [OnDeserialized] работают согласованно, но методы IDeserializationCallback на самом деле не...: (

Я также проверил реализацию OnDeserialization Hashtable и Dictionary, и оба они кажутся безопасными для вызова OnDeserialization более одного раза (только первый вызов выполнит необходимую операцию, последующие вызовы ничего не сделают).

Итак, вы должны назвать OnDeserialization() для Hashtable, как Sean, и предложил Брайан.

Ответ 2

Я подозреваю, что у вас уже есть googled, но вчера я столкнулся с этим шаблоном.

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

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

}