Ответ 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, и предложил Брайан.