Вопрос

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

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

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

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

public virtual void OnDeserialization(object sender)
{
    hashtable.OnDeserialization(sender);
}
Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

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

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

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top