Hashtable.OnDeserialization
-
07-07-2019 - |
Вопрос
У меня есть класс, который поддерживает ссылку на 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"]);
}