Database 继承变坏了吗?

Database 继承变坏了吗?,database,inheritance,serialization,remoting,Database,Inheritance,Serialization,Remoting,就我个人而言,我认为继承是一个很好的工具,合理地应用它可以大大简化代码 然而,在我看来,许多现代工具不喜欢继承。让我们举一个简单的例子:将类序列化为XML。一旦涉及到继承,这很容易变成一团乱麻。特别是当您试图使用基类序列化程序序列化派生类时 当然,我们可以解决这个问题。类似于KnownType属性之类的东西。除了每次添加派生类时都必须记住更新代码这一点之外,如果您从范围之外接收到编译时未知的类,那么这也会失败。(好的,在某些情况下,您仍然可以解决这个问题,例如在.NET中使用NetDataCon

就我个人而言,我认为继承是一个很好的工具,合理地应用它可以大大简化代码

然而,在我看来,许多现代工具不喜欢继承。让我们举一个简单的例子:将类序列化为XML。一旦涉及到继承,这很容易变成一团乱麻。特别是当您试图使用基类序列化程序序列化派生类时

当然,我们可以解决这个问题。类似于
KnownType
属性之类的东西。除了每次添加派生类时都必须记住更新代码这一点之外,如果您从范围之外接收到编译时未知的类,那么这也会失败。(好的,在某些情况下,您仍然可以解决这个问题,例如在.NET中使用NetDataContract序列化程序。这肯定是一个进步。)

无论如何,基本原则仍然存在:序列化和继承不能很好地混合。考虑到在过去十年中大量的编程策略成为可能甚至是常见的,我很想说,在与序列化相关的领域(特别是远程处理和数据库)应该避免继承


这有意义吗?还是我把事情搞砸了?如何处理继承和序列化?

我在当前项目中遇到了这个问题,这可能不是最好的方法,但我为它和它自己的类创建了一个服务层。我认为它被命名为ObjectToSerialized translator和几个接口。通常这是一对一(object和serialized具有完全相同的属性),因此向接口添加一些内容会让您知道“嘿,也在这里添加这个”


我想说的是,我有一个ITO序列化接口,上面有一个简单的方法,用于通用目的,并且在大多数转换中使用automapper。当然,它的代码多了一点,但不管怎样,它工作正常,不会破坏其他东西。

确实有一些继承和序列化的问题。一是它导致序列化/反序列化之间的不对称。如果一个类是子类化的,那么在序列化过程中它将透明地工作,但在反序列化过程中会失败,除非反序列化知道新类。这就是为什么我们有
@see等标记来为XML序列化的数据添加注释

然而,这些问题对于继承来说并不新鲜。它经常在术语“开放/封闭世界”下讨论。或者你认为你知道整个世界和阶级,或者你可能在一个新的类由第三方添加的情况下。在封闭世界的假设中,序列化不是什么大问题。在一个开放世界的假设中,问题更大

但继承和开放世界的假设还有其他问题。例如,如果您删除类中受保护的
方法并进行相应重构,您如何确保没有第三方类在使用它?在一个开放的世界中,您的类的公共和内部API一旦提供给其他类,就必须被视为冻结。你必须非常小心地发展这个系统


关于序列化是如何工作的,还有其他更技术性的内部细节,这可能令人惊讶。这是针对Java的,但我很确定.NET有相似之处。例如,Gilad Bracha,或bug漏洞利用。

这是否可以作为选择组合而不是继承的另一个原因?我相信组合和继承都有自己的应用程序。如果继承是两者中更好的选择,那么我真的很想使用它。我讨厌被迫使用劣质设计,因为技术不支持更好、正确的设计。