问题标签 [ideserializationcallback]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1984 浏览

c# - Hashtable.OnDeserialization

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

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

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

0 投票
4 回答
3780 浏览

c# - IDeserializationCallback 与 OnDeserializedAttribute

据我了解,当对象在反序列化后需要执行某些任务时,可以同时使用 IDeserializationCallback 接口和 OnDeserialized 事件。

IDeserializationCallback:

OnDeserialized 事件:

是否有任何特定的优点/缺点或场景,您会选择其中一个?

0 投票
1 回答
1001 浏览

.net - 可以使用 OnDeserializedAttribute 代替 IDeserializationCallback 接口吗?

正如 MSDN在这里所说,它可以。但是我花了 2 个小时来挖掘 mscorlib 代码,因为在某些情况下,BinaryFormatter 调用了我在反序列化构造函数之前标记为 OnDeserialized 的方法。也就是说,订单是

虽然我期待它是

最后一点。当我实现 IDeserializationCallback 接口时,它的方法 OnDeserialization 被称为 AFTER 构造函数,正如我想要和预期的那样。

我试图在一些简单的类结构上重现这一点,但一切正常。在我们的项目中,被序列化的对象图非常复杂,所以我不知道在哪里挖掘。用反射器检查 mscorlib 代码并没有多大帮助——反序列化​​代码太复杂了,我无法弄清楚问题出在哪里。

那么,有人知道是什么导致了这样的问题吗?我们假设 OnDeserialized 在其他几个地方的构造函数之前被调用,所以我现在很害怕它不是很可靠......

谢谢!

0 投票
1 回答
455 浏览

c# - IDeserializationCallback.OnDeserialization(Object sender):这是语法糖吗?

这里,一个使用IDeserializationCallback接口的例子。

但是这个方法签名对我来说并不熟悉。这个.符号让我觉得这里发生了一些“棘手的”事情。

这里发生了什么?

0 投票
2 回答
483 浏览

.net - 奇怪的反序列化错误,子对象没有完全反序列化

我刚刚注意到二进制序列化中有一个奇怪的行为:当我在我的类中反序列化一个字典并尝试立即向它添加一些东西时,我收到一个错误,因为它没有完全初始化:

在我将数据添加到字典的那一行,我得到一个NullReferenceException,但该Dict属性不为空:它已实例化,但未初始化(其所有字段均为 0 或空)。我怀疑它只是用创建的FormatterServices.GetUninitializedObject,但实际上还没有反序列化。

我知道在这一点上,也许它不应该被完全初始化。所以我尝试了另一种方法,通过实现IDeserializationCallback接口。MSDN 说:

实现当前接口作为对对象图反序列化完成时调用的方法的支持的一部分。

如果一个对象需要对其子对象执行代码,可以延迟这个动作,实现IDeserializationCallback,只有在这个接口被回调时才执行代码

所以它似乎正是我所需要的,我希望我的字典在OnDeserialization被调用时被完全初始化......但我得到了同样的错误!

由于IDeserializationCallback设计用于在子对象上执行代码,我希望此时子对象完全初始化。请注意,如果我OnDeserialize在字典上手动调用,它工作正常,但不知何故我认为我不应该这样做......

这种行为正常吗?谁能解释这里发生了什么?