我一直在阅读.NET中的序列化,并开始想知道将OnSerializing / OnSerialized / OnDeserializing / OnDeserialized功能作为属性实现与接口相比的主要原因是什么。我可以想到一些优点和缺点,但我可能错过了一些至关重要的东西,所以我想知道什么是重要的。
支持界面:
在编译时检查方法签名(使用带有错误签名的方法的属性会导致运行时异常)
在类级别上没有为单个事件声明两个方法(装饰具有相同属性的两个方法会导致运行时异常)
支持属性:
答案 0 :(得分:8)
接口不会那么好,因为在接口顶部的层次结构中没有自动方式来提供自己的实现,除非:
然后,识别每个类的实现会增加复杂性 - 反思更难。
此外,一旦引入了接口,其含义是层次结构中的所有类都是可序列化的,但这并不总是如此,总是就是这种情况。从可序列化的基础(在受控环境中)派生非可序列化类是完全正确的 - 但通过使用接口或虚拟方法可以有效地防止这种情况。
然后,使用属性提供了最简洁,最具表现力和实际上最灵活的方式来实现序列化。
答案 1 :(得分:4)
这是支持界面上的归因方法的另一个原因。
如果使用了接口,则子类可以覆盖方法实现,隐藏基类的实现。当然,子类的实现将有责任显式调用重写方法,但是根据程序员的责任制定正确的程序行为通常是个坏主意。
现在实现的方式,子类的序列化触发方法不会隐藏基类。序列化框架负责确保以正确的顺序调用它们,并且序列化框架是值得信赖的。
答案 2 :(得分:1)
因为实施可以是部分的。如果所有这些方法都位于同一个接口中,那么您可能需要4种方法,但是您必须为它们提供实现。另一方面,每个方法可以有一个接口,但是有时您需要实现4个接口。这是可以通过这种方式避免的许多方法和接口。