我有一个类,它包含对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建议的那样.
这真是一个有趣的问题.在使用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建议的那样.