那是
(1)
class A B extends A C extends B D extends C E extends D implements Serializable
VS。
(2)
A implements Serializable B extends A C extends B D extends C E extends D
(1)在第一种情况下,序列化E将导致E的状态被保存,并且通过调用D的默认构造函数在反序列化时重建A到D.
(2)在第二种情况下,序列化E将导致A到E的状态全部被保存,并且在反序列化时不需要重建(因为从可序列化的基类继承所有内容都是可序列化的。)
第一种方式是否有任何危险?是否存在这样的情况:通过第一种方式执行序列化/反序列化期间传输的数据的节省将足以使其成为首选方法,还是总是最好完全序列化类层次结构?
提前致谢。
答案 0 :(得分:0)
在超类中实现Serializable
通常不被认为是最佳实践,特别是如果它是作为导出API层次结构中的基类(但是,您的基类应该旨在预测实现Serializable的子类;见下文)。原因是它强制API的客户端使其子类可序列化,无论它们是否有用(Essential Java,2nd Ed)。
此规则的例外情况是基类本身参与需要Serializable
的框架。
无论如何,如果子类是可序列化的而且其父类不可序,则可能会出现问题。在这种情况下,子类负责序列化和反序列化其父级的状态。缺点是:
final
Serializable
的父类本身需要no-arg构造函数对Essential Java,2nd Ed中序列化Java实例的缺陷和推荐做法进行了很好的讨论。