Serializable 与 Externalizable 的区别

  • Java中的类通过实现 java.io.Serializable 接口以启⽤其序列化功能。 未实现此接口的类将⽆法使其任何状态序列化或反序列化。
  • 可序列化类的所有⼦类型本⾝都是可序列化的。
  • 序列化接口没有⽅法或字段, 仅⽤于标识可序列化的语义。
  • 当试图对⼀个对象进⾏序列化的时候, 如果遇到不⽀持Serializable 接口的对象。 在此情况下, 将抛NotSerializableException
  • 如果要序列化的类有⽗类, 要想同时将在⽗类中定义过的变量持久化下来, 那么⽗类也应该集成java.io.Serializable接口。
  • Externalizable继承了Serializable, 该接口中定义了两个抽象⽅法:writeExternal()readExternal()。 当使⽤Externalizable接口来进⾏序列化与反序列化的时候需要开发⼈员重写 writeExternal()readExternal() ⽅法。
  • 如果没有在这两个⽅法中定义序列化实现细节, 那么序列化之后, 对象内容为空。
  • 实现Externalizable接口的类必须要提供⼀个public的⽆参的构造器。
  • 所以, 实现Externalizable, 并实现writeExternal()readExternal()⽅法可以指定序列化哪些属性。
下一节:虚拟机是否允许反序列化, 不仅取决于类路径和功能代码是否⼀致, ⼀个⾮常重要的⼀点是两个类的序列化 ID 是否⼀致,即serialVersionUID要求⼀致。