gpt4 book ai didi

c# - Hashtable.OnDeserialization

转载 作者:可可西里 更新时间:2023-11-01 09:09:43 25 4
gpt4 key购买 nike

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

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

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

我的问题是,从父类的 OnDeserialization 方法显式调用 Hashtable.OnDeserialization 是否安全,以便我可以在此时枚举它?

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

最佳答案

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

您可能已经看到,在反序列化过程中还有其他两种方法可以运行某些代码,即 [OnDeserializing] 和 [OnDeserialized] 属性。不幸的是,两者都在 IDeserializationCallback.OnDeserialization() 之前运行。这是方法的运行顺序,如果您有引用类 2 的类 1:

Class1: [OnDeserializing]
Class2: [OnDeserializing]
Class2: [OnDeserialized]
Class1: [OnDeserialized]
Class1: IDeserializationCallback.OnDeserialization
Class2: IDeserializationCallback.OnDeserialization

如您所见,[OnDeserializing] 和 [OnDeserialized] 属性的工作方式一致,但 IDeserializationCallback 方法并非如此……:(

我还检查了 Hashtable 和 Dictionary 的 OnDeserialization 实现,两者似乎都可以安全地多次调用 OnDeserialization(只有第一次调用会执行必要的操作,后续调用什么都不做)。

所以最后你应该调用 Hashtable 的 OnDeserialization(),作为 Sean和布赖恩建议。

关于c# - Hashtable.OnDeserialization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/279524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com