10

我有一个类维护对哈希表的引用并序列化/反序列化该哈希表。调用 SerializationInfo.GetValue 后,Hashtable 未完全反序列化,因为反序列化发生在 IDeserialization 回调期间。

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

我还在父类中实现了 IDeserialization 回调,但是 Hashtable 还没有完全反序列化。我预计反序列化是从内到外发生的。

我的问题是,从我的父类的 OnDeserialization 方法中显式调用 Hashtable.OnDeserialization 是否安全,以便我可以在那时枚举它?

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

2 回答 2

6

这真是一个有趣的问题。使用 Reflector 检查序列化代码后,我认为如果引用的类使用 IDeserializationCallback,则没有普遍好的解决方案。

可能您已经看到,在反序列化期间还有两种其他方法可以运行某些代码,即 [OnDeserializing] 和 [OnDeserialized] 属性。不幸的是,两者都在 IDeserializationCallback.OnDeserialization() 之前运行。如果您有引用 class2 的 class1,则这是方法的运行顺序:

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

如您所见,[OnDeserializing] 和 [OnDeserialized] 属性工作一致,但 IDeserializationCallback 方法并不真正...... :(

我还检查了 Hashtable 和 Dictionary 的 OnDeserialization 实现,两者似乎都可以安全地多次调用 OnDeserialization(只有第一次调用会执行必要的操作,后续调用什么也不做)。

所以最后你应该调用 Hashtable 的 OnDeserialization(),正如Sean和 Brian 建议的那样。

于 2008-11-19T10:13:33.623 回答
3

我怀疑你已经用谷歌搜索过了,但我昨天 碰巧遇到了这种模式。

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

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

}
于 2008-11-13T19:02:51.000 回答