我有一个类,它维护对Hashtable的引用,并序列化/反序列化该Hashtable。在调用SerializationInfo.GetValue之后,哈希表没有完全反序列化,因为反序列化发生在IDeserialization回调期间。
Hashtable hashtable = (Hashtable) info.GetValue("hash", typeof(Hashtable));我还在父类中实现了IDeserialization回调,但是哈希表还没有完全反序列化。如果反序列化是从内到外发生的,我希望是这样的。
我的问题是,显式地从父类的OnDeserialization方法调用Hashtable.OnDeserialization,这样我就可以在那时枚举它,这样安全吗?
public virtual void OnDeserialization(object sender)
{
hashtable.OnDeserialization(sender);
}发布于 2008-11-19 10:13:34
这真的是一个有趣的问题。在使用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方法并不是真正的...:(
我还检查了哈希表和字典的OnDeserialization实现,这两种方法对于多次调用OnDeserialization似乎都是安全的(只有第一次调用将执行必要的操作,后续调用将不会执行任何操作)。
因此,最后应该调用哈希表的OnDeserialization(),正如Sean和Brian所建议的那样。
发布于 2008-11-13 19:02:51
我怀疑你已经用谷歌搜索过了,但我昨天碰巧遇到了this pattern。
public BoringClass(SerializationInfo info, StreamingContext context)
{
Hashtable hashtable = (Hashtable) info.GetValue("hash", typeof(Hashtable));
hashtable.OnDeserialization(this);
Console.WriteLine("Value is: " + hashtable["testItem"]);
}https://stackoverflow.com/questions/279524
复制相似问题