13

据我了解,当对象在反序列化后需要执行某些任务时,可以同时使用 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.
    }
}

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

4

4 回答 4

10

这两者有不同的用途,不能互换使用。在大多数情况下,界面可能会更好地为您服务。

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

于 2010-06-23T19:38:25.170 回答
8

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

" DeserializationCallback.OnDeserialization "在整个对象图被反序列化后运行。" (链接)。

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

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

于 2012-12-18T10:35:25.033 回答
2

关于这篇博文的进一步讨论

于 2012-12-18T10:36:33.740 回答
1

我想知道同样的事情。就优点/缺点而言,我只能推断该接口的优势在于它迫使您实现正确的方法签名,因为属性版本将很高兴地让您编译您的类,而不管您的方法签名是什么样的.

于 2009-09-20T09:11:22.593 回答