标签: ideserializationcallback

IDeserializationCallback与OnDeserializedAttribute

据我所知,IDeserializationCallback接口和OnDeserialized事件都可以在对象需要在反序列化后执行某些任务时使用.

IDeserializationCallback:

[Serializable]
public class Foo : IDeserializationCallback
{
    public void OnDeserialization(object sender)
    {
         // initialize unserialized fields etc.
    }
}
Run Code Online (Sandbox Code Playgroud)

OnDeserialized事件:

[Serializable]
public class Foo
{
    [OnDeserialized]
    public void OnDeserialized(StreamingContext context)
    {
         // initialize unserialized fields etc.
    }
}
Run Code Online (Sandbox Code Playgroud)

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

.net c# serialization ideserializationcallback

12
推荐指数
3
解决办法
3499
查看次数

Hashtable.OnDeserialization

我有一个类,它包含对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)

c# serialization hashtable ideserializationcallback

10
推荐指数
1
解决办法
1954
查看次数

可以使用OnDeserializedAttribute而不是IDeserializationCallback接口吗?

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

OnDeserializing(StreamingContext context)
OnDeserialized(StreamingContext context)
.ctor(SerializationInfo info, StreamingContext context)
Run Code Online (Sandbox Code Playgroud)

虽然我期待它

OnDeserializing(StreamingContext context)
.ctor(SerializationInfo info, StreamingContext context)
OnDeserialized(StreamingContext context)
Run Code Online (Sandbox Code Playgroud)

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

我尝试在一些简单的类结构上重现这一点,但一切都运行正常.在我们的项目中,被序列化的对象图非常复杂,所以我不知道在哪里挖掘.使用反射器检查mscorlib代码并没有太大帮助 - 反序列化代码对我来说太复杂了,无法找出问题的来源.

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

谢谢!

.net serialization ideserializationcallback

7
推荐指数
1
解决办法
935
查看次数