Externalizable与Serializable有何不同?

时间:2013-08-27 18:44:38

标签: java serialization deserialization externalizable

我读了那个

Externalizable为我们提供了writeExternal()和readExternal()方法,它使我们可以灵活地控制java序列化机制,而不是依赖于Java的默认序列化。

但是如果我实现Serializable并覆盖readObject(), writeObject(),那么它是否也意味着我自定义序列化过程?

它有何不同?

感谢。

2 个答案:

答案 0 :(得分:4)

Externalizable和Serializable之间的区别

  
      
  1. 如果是Serializable,则使用默认序列化过程。而在Externalizable的情况下,使用了由应用程序实现的序列化过程。
  2.   
  3. JVM回调java.io.Externalizalbe接口的readExternel()和writeExternal(),用于恢复和将对象写入持久性。
  4.   
  5. Externalizable接口为应用程序提供了对序列化过程的完全控制。
  6.   
  7. readExternal()和writeExternal()取代了writeObject和readObject方法的任何特定实现。
  8.         

    虽然Externalizable提供了完全控制,但它也带来了串行化超类型状态的挑战,并在Java中使用瞬态变量和静态变量时处理默认值。如果使用正确,Externalizable接口可以提高序列化过程的性能。

所以选择Externalizable接口

  

当您对对象的序列化有特殊要求时。例如,您可能有一些对象的安全敏感部分,如密码,您不想保留和转移到某处。或者,保存从主对象引用的特定对象可能毫无价值,因为它的值在恢复后将变得毫无价值。

答案 1 :(得分:2)

Official docs on Bean Persistence

  

当需要序列化默认序列化无法处理的对象时,或者需要将数据添加到不是对象数据成员的序列化流时,需要对需要序列化的内容进行更好的控制时,实现writeObject。实现readObject以重建使用writeObject编写的数据流。

     

当您需要完全控制bean的序列化时(例如,在编写和读取特定文件格式时),请使用Externalizable接口。要使用Externalizable接口,您需要实现两个方法:readExternal和writeExternal。实现Externalizable的类必须具有无参数构造函数。