首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IDeserializationCallback vs OnDeserializedAttribute

IDeserializationCallback vs OnDeserializedAttribute
EN

Stack Overflow用户
提问于 2009-08-20 19:39:15
回答 4查看 3.8K关注 0票数 13

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

IDeserializationCallback:

代码语言:javascript
复制
[Serializable]
public class Foo : IDeserializationCallback
{
    public void OnDeserialization(object sender)
    {
         // initialize unserialized fields etc.
    }
}

OnDeserialized事件:

代码语言:javascript
复制
[Serializable]
public class Foo
{
    [OnDeserialized]
    public void OnDeserialized(StreamingContext context)
    {
         // initialize unserialized fields etc.
    }
}

是否有任何特定的优缺点或场景,您会选择一个而不是另一个?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-20 09:11:23

我也想知道同样的事情。就优缺点而言,我唯一的理由是该接口有一个优势,那就是它迫使你实现正确的方法签名-因为属性版本会让你很高兴地编译你的类,而不管你的方法签名是什么样子。

票数 1
EN

Stack Overflow用户

发布于 2010-06-24 03:38:25

这两种方法的用途不同,不能互换使用。在大多数情况下,接口可能会为您提供更好的服务。

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

票数 10
EN

Stack Overflow用户

发布于 2012-12-18 18:35:25

Darren Headrick的帖子来自上面的链接(为了完整性):

DeserializationCallback.OnDeserialization“在整个对象图被反序列化时运行。”(link)。

然而,OnDeserialized事件“在反序列化对象被反序列化之后返回图形之前,当您需要确定反序列化对象上的值时,请使用OnDeserializedAttribute。可以使用该属性来代替IDeserializationCallback接口。”(link)。

由于OnDeserialized属性可用于修改对象图,因此在OnDeserialization之前调用它(这表示对象图处于最终状态)。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1308373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档