代码之家  ›  专栏  ›  技术社区  ›  Erik Öjebo

IDeserializationCallback与OnDeserializationDattribute

  •  12
  • Erik Öjebo  · 技术社区  · 15 年前

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

    IDeserializationCallback:

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

    已序列化事件:

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

    是否有任何具体的优点/缺点或场景,您会选择其中一个而不是另一个?

    4 回复  |  直到 15 年前
        1
  •  10
  •   Val    14 年前

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

    http://social.msdn.microsoft.com/Forums/en-US/netfxremoting/thread/311b2b57-6b0a-49ed-aa96-84f69d51da0f

        2
  •  8
  •   Sam Mackrill    12 年前

    Darren Headlick在上述链接中的帖子(完整性):

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

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

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

        3
  •  2
  •   Sam Mackrill    12 年前

    关于这一点的进一步讨论 blog post

        4
  •  1
  •   CodeAndCats    15 年前

    我也在想同样的事情。就优点/缺点而言,我只能认为接口的优势在于它强制您实现正确的方法签名,而作为属性版本,无论方法签名是什么样的,都可以让您编译类。