Hashtable.OnDeserialization

jam*_*lle 10 c# serialization hashtable ideserializationcallback

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

Hashtable hashtable = (Hashtable) info.GetValue("hash", typeof(Hashtable));
Run Code Online (Sandbox Code Playgroud)

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

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

public virtual void OnDeserialization(object sender)
{
    hashtable.OnDeserialization(sender);
}
Run Code Online (Sandbox Code Playgroud)

Gas*_*agy 6

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

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

Class1: [OnDeserializing]
Class2: [OnDeserializing]
Class2: [OnDeserialized]
Class1: [OnDeserialized]
Class1: IDeserializationCallback.OnDeserialization
Class2: IDeserializationCallback.OnDeserialization
Run Code Online (Sandbox Code Playgroud)

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

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

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