首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hashtable.OnDeserialization

Hashtable.OnDeserialization
EN

Stack Overflow用户
提问于 2008-11-10 23:13:06
回答 2查看 2K关注 0票数 10

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

代码语言:javascript
复制
Hashtable hashtable = (Hashtable) info.GetValue("hash", typeof(Hashtable));

我还在父类中实现了IDeserialization回调,但是哈希表还没有完全反序列化。如果反序列化是从内到外发生的,我希望是这样的。

我的问题是,显式地从父类的OnDeserialization方法调用Hashtable.OnDeserialization,这样我就可以在那时枚举它,这样安全吗?

代码语言:javascript
复制
public virtual void OnDeserialization(object sender)
{
    hashtable.OnDeserialization(sender);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2008-11-19 10:13:34

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

您可能已经看到,在反序列化过程中还有另外两种运行代码的方法,即OnDeserializing和OnDeserialized属性。不幸的是,这两个函数都在IDeserializationCallback.OnDeserialization()之前运行。如果您有引用class2的class1,则以下是方法的运行顺序:

代码语言:javascript
复制
Class1: [OnDeserializing]
Class2: [OnDeserializing]
Class2: [OnDeserialized]
Class1: [OnDeserialized]
Class1: IDeserializationCallback.OnDeserialization
Class2: IDeserializationCallback.OnDeserialization

正如您所看到的,OnDeserializing和OnDeserialized属性的工作方式是一致的,但是IDeserializationCallback方法并不是真正的...:(

我还检查了哈希表和字典的OnDeserialization实现,这两种方法对于多次调用OnDeserialization似乎都是安全的(只有第一次调用将执行必要的操作,后续调用将不会执行任何操作)。

因此,最后应该调用哈希表的OnDeserialization(),正如Sean和Brian所建议的那样。

票数 6
EN

Stack Overflow用户

发布于 2008-11-13 19:02:51

我怀疑你已经用谷歌搜索过了,但我昨天碰巧遇到了this pattern。

代码语言:javascript
复制
public BoringClass(SerializationInfo info, StreamingContext context)
{
    Hashtable hashtable = (Hashtable) info.GetValue("hash", typeof(Hashtable));
    hashtable.OnDeserialization(this);

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

}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/279524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档