为什么设计用于继承的类很少应该实现Serializable接口?

时间:2013-06-05 17:57:46

标签: java inheritance serialization

根据Effective Java:

  

为继承而设计的类应该很少实现Serializable,   和接口应该很少扩展它。

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

3 个答案:

答案 0 :(得分:7)

同一项目中的下一句话是:

  

为继承而设计的类(第17项)应该很少实现Serializable,接口应该很少扩展它。 违反此规则会给扩展类或实现界面的任何人带来沉重的负担。有时候违反规则是合适的。例如,如果一个类或接口主要存在于需要所有参与者实现Serializable的框架中,那么实现或扩展Serializable对于类或接口来说是完全合理的。

由于我不希望Josh因侵犯版权而受到侮辱(尽管可能很酷),但我不会复制此答案中的所有项目。我只想说这个问题的原因在本项目的其余部分进行了解释。

编辑:Josh列出了实施Serializable的一些费用。如果接口/超类实现它,则会将成本强制转换为扩展类。

  

实施Serializable的主要成本是它减少了   一旦改变了类的实现,就具有灵活性   释放。 ...

     

...

     

实施Serializable的第二个成本是它增加了   错误和安全漏洞的可能性。 ...

     

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:0)

可序列化类的所有子类型本身都可以序列化为指定的here。因此,如果要序列化为继承而设计的类,则应该知道是否需要序列化所有子类。否则,您可以序列化所需的类仅限子类。