在完全可序列化的层次结构中序列化类的优点/缺点是什么,与不可序列化的祖先的Serializable child相比?

时间:2014-06-16 06:01:33

标签: java serialization

那是

(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的状态全部被保存,并且在反序列化时不需要重建(因为从可序列化的基类继承所有内容都是可序列化的。)

第一种方式是否有任何危险?是否存在这样的情况:通过第一种方式执行序列化/反序列化期间传输的数据的节省将足以使其成为首选方法,还是总是最好完全序列化类层次结构?

提前致谢。

1 个答案:

答案 0 :(得分:0)

在超类中实现Serializable通常不被认为是最佳实践,特别是如果它是作为导出API层次结构中的基类(但是,您的基类应该旨在预测实现Serializable的子类;见下文)。原因是它强制API的客户端使其子类可序列化,无论它们是否有用(Essential Java,2nd Ed)。

此规则的例外情况是基类本身参与需要Serializable的框架。

无论如何,如果子类是可序列化的而且其父类不可序,则可能会出现问题。在这种情况下,子类负责序列化和反序列化其父级的状态。缺点是:

  • 父字段不能为final
  • 如果子类无法访问父字段,则可能无法使用正确的序列化表示
  • 未实现Serializable的父类本身需要no-arg构造函数

对Essential Java,2nd Ed中序列化Java实例的缺陷和推荐做法进行了很好的讨论。