2013-06-05 33 views
8

根据有效的Java:为什么为继承设计的类应该很少实现Serializble接口?

类设计继承应该很少实现Serializable, 和接口应该很少对它进行扩展。

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

+4

我的记忆可能会生锈,但如果我是对的,乔希布洛赫解释了同一项目中的推理。 –

+0

@ZiyaoWei不,他没有。 – Geek

+0

我想这意味着所有继承自这个类的类都可以被序列化(这并不一定是真的) –

回答

7

在同一项目下一句说的:

类设计继承(第17项)应该很少实现Serializable和接口应该很少对它进行扩展。 违反这条规则给扩展类或实现接口的任何人造成了沉重的负担。有时违反规则是适当的。例如,如果一个类或接口主要存在于要求所有参与者实现Serializable的框架中,那么对于类或接口来说,实现或扩展Serializable是非常有意义的。

因为我不希望Josh在我的尾巴上侵犯版权(尽可能酷),所以我不会复制这个答案中的所有项目。完全可以说这个问题的推理在本文的其余部分中有解释。

编辑:约什列出了实施Serializable的一些成本。如果一个接口/超类实现它,成本将被强制到扩展类。

实现Serializable接口的主要成本是它降低了 灵活地改变一个类的实现,一旦它已被释放 。 ...

...

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

实现Serializable的第三个代价是它增加了与释放新版本类相关的测试负担。

+1

粗体行如何回答我的问题?为什么违反这条规则会造成很大的负担?我正在寻找一些解释... – Geek

+0

因为实现类必须确保它们使用的任何类必须是可序列化的或定义为瞬态的。 –

+0

@Ziyao +1为编辑。 – Geek

0

序列化类的所有子类型本身可序列化的规定here。所以如果你要设计序列继承一个类你应该知道的所有子类是否需要为serialized.Otherwise可以序列所需子只有类。

7

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

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

+0

对于在子类中添加不可序列化字段的示例+1。 – Geek

+0

+1表示答案的清晰度。 – eternay

+0

+1,但我必须说布洛赫给出的理由没有意义。对此没有“力量”:如果类将要被序列化,这种“重大负担”仅仅放在将来的实现者*上,在这种情况下,“重大负担”是不可避免的,以及“实现Serializable”放置不会有丝毫的区别。 – EJP

相关问题