Java 为什么为继承设计的类很少实现可序列化接口?

Java 为什么为继承设计的类很少实现可序列化接口?,java,inheritance,serialization,Java,Inheritance,Serialization,根据有效的Java: 设计用于继承的类很少实现可序列化, 接口很少会扩展它 这句话背后的原因是什么?换句话说,如果他们实现了可序列化接口,会出现什么问题?同一项中的下一句话说: 为继承而设计的类(第17项)很少应该实现可序列化,接口也很少应该扩展它违反此规则会给扩展类或实现接口的任何人带来沉重负担。有时违反此规则是适当的。例如,如果一个类或接口的存在主要是为了参与一个要求所有参与者实现Serializable的框架,那么该类或接口实现或扩展Serializable是完全有意义的 因为我不想让Jo

根据有效的Java:

设计用于继承的类很少实现可序列化, 接口很少会扩展它


这句话背后的原因是什么?换句话说,如果他们实现了可序列化接口,会出现什么问题?

同一项中的下一句话说:

为继承而设计的类(第17项)很少应该实现可序列化,接口也很少应该扩展它违反此规则会给扩展类或实现接口的任何人带来沉重负担。有时违反此规则是适当的。例如,如果一个类或接口的存在主要是为了参与一个要求所有参与者实现Serializable的框架,那么该类或接口实现或扩展Serializable是完全有意义的

因为我不想让Josh因为侵犯版权而被我跟踪(尽管这可能很酷),所以我不会复制这个答案中的所有内容。我只想说,这一点的原因将在本项目的其余部分进行解释

编辑:Josh列出了实现
Serializable
的许多成本。如果一个接口/超类实现了它,那么扩展类将被迫承担成本

实现Serializable的一个主要成本是降低了 在类实现完成后更改类实现的灵活性 释放

实现Serializable的第二个成本是它增加了 漏洞和安全漏洞的可能性

实现Serializable的第三个成本是它增加了 与发布类的新版本相关的测试负担


可序列化类的所有子类型本身都可以按指定进行序列化。因此,如果要序列化为继承而设计的类,则应知道是否需要序列化所有子类。否则,只能序列化所需的子类。

如果基类或接口实现了可序列化,它强制每个子类或实现履行超类或接口的契约,以确保子类或实现也是可序列化的


例如,这会阻止任何实现向其实现中添加非瞬态且不可序列化的字段。

我的内存可能已经生锈,但如果我是对的,Josh Bloch在同一项中解释了原因。@ZiyaoWei不,他没有。我想这意味着从这个类继承的所有类都可以序列化(这不一定是真的)@Geek,但他确实这么做了…同一段继续说,违反这条规则会给任何扩展类或实现接口的人带来巨大负担…@Geek,请参见下面Ziyao的答案…他列出的所有内容似乎都是从书中粘贴出来的。粗体线如何回答我的问题?为什么违反这条规则会导致重大负担?我在寻找一些解释……因为实现类必须确保它们使用的任何类都必须是可序列化的或定义为瞬态的。+1用于在子类中添加不可序列化字段的示例。+1但我必须说Bloch给出的理由没有意义。关于它没有“强制力”:这是只有当类要被序列化时,“重大负担”才会被放在未来的实现者身上,在这种情况下,“重大负担”是不可避免的,而
implements Serializable
的确切位置与此没有丝毫区别。