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

gry*_*k44 4 .net c# serialization

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

支持界面:

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

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

赞成属性:

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

And*_*tan 8

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

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

然后是识别每个类的实现的额外复杂性 - 反思更难.

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

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