深入理解序列化与反序列化
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.1 Java序列化入门

2.1.1 Java序列化实现方式

Java序列化的实现方式有以下三种。

1)自定义类实现Serializable,不包含readObject和writeObject方法,使用默认的序列化和反序列化方式进行数据写入和读取操作,如以下代码所示。

img

2)自定义类实现Serializable,同时包含readObject和writeObject方法,使用自定义的序列化和反序列化方式进行数据写入和读取操作。readObject方法和writeObject方法的可见性没有限制,可以是private、protected、default、public,如以下代码所示。

img

3)自定义类实现Externalizable,通过覆盖readExternal方法和writeExternal方法来实现序列化和反序列化功能。readExternal方法和writeExternal方法的可见性没有限制,可以是private、protected、default、public。此外,还需要定义无参构造函数,如以下代码所示。

img

2.1.2 Java序列化应用

Java序列化输出通过ObjectOutputStream来实现,应用案例如以下代码所示。

img
img

通过上述代码可以看出,Java序列化使用起来很简洁。结合2.1.1节的内容,读者应该会有以下几个疑问:

1)自定义的Person类实现了Serializable,那么Serializable起什么作用呢?

2)Serializable和Externalizable有什么区别呢?什么场景使用Serializable?什么场景使用Externalizable?

3)为什么需要定义一个serialVersionUID常量,这个常量的意义是什么?(除此以外,这个常量的定义为什么不是全部大写?)

4)ObjectOutputStream调用writeObject方法就实现了对象序列化功能,writeObject方法在内部做了什么事情使得Java序列化应用起来如此简洁?

带着这些疑问,我们开始深入了解Java序列化技术的原理。