IDeserializationCallback VS OnDeserializedAttribut

2019-08-01 23:42发布

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

IDeserializationCallback:

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

OnDeserialized事件:

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

在那里,你会选择一个比其他任何具体的优点/缺点或方案?

Answer 1:

我一直想知道同样的事情。 至于优点/缺点去,我只能原因,接口有,因为它迫使你实现正确的方法签名的优势在哪里,作为属性的版本会很乐意让不管你的方法签名是什么样子,你编译类。



Answer 2:

这两个服务于不同目的,不能互换使用。 在大多数情况下,你可能会得到更好的接口服务。

在这里寻找一些解释: http://social.msdn.microsoft.com/Forums/en-US/netfxremoting/thread/311b2b57-6b0a-49ed-aa96-84f69d51da0f



Answer 3:

从上面(的完整性)链接达伦黑德里克的帖子:

DeserializationCallback.OnDeserialization“当整个对象图已被反序列化运行”。 ( 链接 )。

该OnDeserialized事件不过“当你需要一个反序列化对象的固定值已经反序列化并返回图形之前,该属性可以代替IDeserializationCallback界面后使用OnDeserializedAttribute。” ( 链接 )。

由于OnDeserialized属性可以用于修改对象图,它被调用之前OnDeserialization(其表示对象图是在其最终状态)。



Answer 4:

在此进一步讨论博客文章



文章来源: IDeserializationCallback vs OnDeserializedAttribute