5

我读到了

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

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

它有什么不同?

谢谢。

4

2 回答 2

5

可外部化和可序列化之间的区别

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

尽管 Externalizable 提供了完全的控制,但它也对序列化超类型状态和处理 Java 中的瞬态变量和静态变量的默认值提出了挑战。如果正确使用 Externalizable 接口可以提高序列化过程的性能。

所以选择 Externalizable 接口

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

于 2013-08-27T18:51:18.113 回答
3

关于 Bean Persistence 的官方文档

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

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

于 2013-08-27T18:51:50.593 回答