据我所知,当对象在反序列化后需要执行某些任务时,可以同时使用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.
}
}是否有任何特定的优缺点或场景,您会选择一个而不是另一个?
发布于 2009-09-20 09:11:23
我也想知道同样的事情。就优缺点而言,我唯一的理由是该接口有一个优势,那就是它迫使你实现正确的方法签名-因为属性版本会让你很高兴地编译你的类,而不管你的方法签名是什么样子。
发布于 2010-06-24 03:38:25
这两种方法的用途不同,不能互换使用。在大多数情况下,接口可能会为您提供更好的服务。
在这里可以找到一些解释:http://social.msdn.microsoft.com/Forums/en-US/netfxremoting/thread/311b2b57-6b0a-49ed-aa96-84f69d51da0f
发布于 2012-12-18 18:35:25
Darren Headrick的帖子来自上面的链接(为了完整性):
DeserializationCallback.OnDeserialization“在整个对象图被反序列化时运行。”(link)。
然而,OnDeserialized事件“在反序列化对象被反序列化之后返回图形之前,当您需要确定反序列化对象上的值时,请使用OnDeserializedAttribute。可以使用该属性来代替IDeserializationCallback接口。”(link)。
由于OnDeserialized属性可用于修改对象图,因此在OnDeserialization之前调用它(这表示对象图处于最终状态)。
https://stackoverflow.com/questions/1308373
复制相似问题