根据Effective Java:
为继承而设计的类应该很少实现Serializable, 和接口应该很少扩展它。
这句话背后的原因是什么?换句话说,如果他们实现了Serializable接口会出现什么问题?
答案 0 :(得分:7)
同一项目中的下一句话是:
为继承而设计的类(第17项)应该很少实现Serializable,接口应该很少扩展它。 违反此规则会给扩展类或实现界面的任何人带来沉重的负担。有时候违反规则是合适的。例如,如果一个类或接口主要存在于需要所有参与者实现Serializable的框架中,那么实现或扩展Serializable对于类或接口来说是完全合理的。
由于我不希望Josh因侵犯版权而受到侮辱(尽管可能很酷),但我不会复制此答案中的所有项目。我只想说这个问题的原因在本项目的其余部分进行了解释。
编辑:Josh列出了实施Serializable
的一些费用。如果接口/超类实现它,则会将成本强制转换为扩展类。
实施Serializable的主要成本是它减少了 一旦改变了类的实现,就具有灵活性 释放。 ...
...
实施Serializable的第二个成本是它增加了 错误和安全漏洞的可能性。 ...
实施Serializable的第三个成本是增加了 测试与发布新版本类相关的负担。
答案 1 :(得分:7)
如果基类或接口实现Serializable,它会强制每个子类或实现,以履行超类或接口的约定,以确保子类或实现也是可序列化的。
这可以防止任何实现添加非瞬态且不可序列化的字段到其实现中,例如。
答案 2 :(得分:0)
可序列化类的所有子类型本身都可以序列化为指定的here。因此,如果要序列化为继承而设计的类,则应该知道是否需要序列化所有子类。否则,您可以序列化所需的类仅限子类。