当前位置:  开发笔记 > 编程语言 > 正文

Hashtable.OnDeserialization

如何解决《Hashtable.OnDeserialization》经验,为你挑选了1个好方法。

我有一个类,它包含对Hashtable的引用,并序列化/反序列化该Hashtable.在调用SerializationInfo.GetValue之后,Hashtable没有完全反序列化,因为反序列化在IDeserialization calback期间发生.

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

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

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

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

Gaspar Nagy.. 6

这真是一个有趣的问题.在使用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方法并不真正... :(

我还检查了Hashtable和Dictionary的OnDeserialization实现,并且两者似乎都可以安全地多次调用OnDeserialization(只有第一次调用才会执行必要的操作,后续调用将不执行任何操作).

所以最后你应该调用Hashtable的OnDeserialization(),就像Sean和Brian建议的那样.



1> Gaspar Nagy..:

这真是一个有趣的问题.在使用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方法并不真正... :(

我还检查了Hashtable和Dictionary的OnDeserialization实现,并且两者似乎都可以安全地多次调用OnDeserialization(只有第一次调用才会执行必要的操作,后续调用将不执行任何操作).

所以最后你应该调用Hashtable的OnDeserialization(),就像Sean和Brian建议的那样.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有