OnSerializing / OnSerialized / OnDeserializing / OnDeserialized为什么不是一个接口?

时间:2011-03-15 18:49:23

标签: c# .net serialization

我一直在阅读.NET中的序列化,并开始想知道将OnSerializing / OnSerialized / OnDeserializing / OnDeserialized功能作为属性实现与接口相比的主要原因是什么。我可以想到一些优点和缺点,但我可能错过了一些至关重要的东西,所以我想知道什么是重要的。

支持界面:

  • 在编译时检查方法签名(使用带有错误签名的方法的属性会导致运行时异常)

  • 在类级别上没有为单个事件声明两个方法(装饰具有相同属性的两个方法会导致运行时异常)

支持属性:

  • 如果我们想要对单个事件做出反应,则无需声明4个方法

3 个答案:

答案 0 :(得分:8)

接口不会那么好,因为在接口顶部的层次结构中没有自动方式来提供自己的实现,除非:

  • 基类将方法声明为虚拟
  • 每个派生类重新实现接口

然后,识别每个类的实现会增加复杂性 - 反思更难。

此外,一旦引入了接口,其含义是层次结构中的所有类都是可序列化的,但这并不总是如此,总是就是这种情况。从可序列化的基础(在受控环境中)派生非可序列化类是完全正确的 - 但通过使用接口或虚拟方法可以有效地防止这种情况。

然后,使用属性提供了最简洁,最具表现力和实际上最灵活的方式来实现序列化。

答案 1 :(得分:4)

这是支持界面上的归因方法的另一个原因。

如果使用了接口,则子类可以覆盖方法实现,隐藏基类的实现。当然,子类的实现将有责任显式调用重写方法,但是根据程序员的责任制定正确的程序行为通常是个坏主意。

现在实现的方式,子类的序列化触发方法不会隐藏基类。序列化框架负责确保以正确的顺序调用它们,并且序列化框架是值得信赖的。

答案 2 :(得分:1)

因为实施可以是部分的。如果所有这些方法都位于同一个接口中,那么您可能需要4种方法,但是您必须为它们提供实现。另一方面,每个方法可以有一个接口,但是有时您需要实现4个接口。这是可以通过这种方式避免的许多方法和接口。