我了解到
Externalizable提供了writeExternal()和readExternal()方法,使我们能够控制Java序列化机制,而不是依赖于Java的默认序列化。
但是,如果我实现Serializable并覆盖readObject(),writeObject()
,那么这是否意味着我也在自定义序列化过程?
它们有什么区别吗?
谢谢。
我了解到
Externalizable提供了writeExternal()和readExternal()方法,使我们能够控制Java序列化机制,而不是依赖于Java的默认序列化。
但是,如果我实现Serializable并覆盖readObject(),writeObject()
,那么这是否意味着我也在自定义序列化过程?
它们有什么区别吗?
谢谢。
Externalizable和Serializable的区别
- 在Serializable中,使用默认的序列化过程。而在Externalizable中,使用应用程序实现的自定义序列化过程。
- JVM调用java.io.Externalizalbe接口的readExternel()和writeExternal()方法来将对象恢复和写入持久性存储。
- Externalizable接口为应用程序提供完全控制序列化过程的能力。
- readExternal()和writeExternal()方法优先于writeObject和readObject方法的特定实现。
虽然Externalizable提供了完全的控制,但在Java中序列化超类型状态并处理瞬态变量和静态变量的默认值也是一项挑战。如果正确使用Externalizable接口,可以提高序列化过程的性能。
因此,选择Externalizable接口。
当您对对象的序列化有特殊要求时。例如,您可能拥有一些安全敏感的对象部分(如密码),不希望将其保存和传输到某个地方。或者,在从主对象引用的特定对象之后,保存该对象的价值将变得毫无意义。
当您需要对序列化进行更大的控制,或者需要序列化默认序列化无法处理的对象或者需要添加数据到序列化流中时,请实现writeObject方法。当您需要使用writeObject方法写入的数据重建数据流时,请实现readObject方法。
当您需要完全控制Bean的序列化(例如,写入和读取特定文件格式)时,请使用Externalizable接口。要使用Externalizable接口,您需要实现两个方法:readExternal和writeExternal。实现Externalizable接口的类必须有一个无参数的构造函数。