![深入理解序列化与反序列化](https://wfqqreader-1252317822.image.myqcloud.com/cover/521/34667521/b_34667521.jpg)
2.1 Java序列化入门
2.1.1 Java序列化实现方式
Java序列化的实现方式有以下三种。
1)自定义类实现Serializable,不包含readObject和writeObject方法,使用默认的序列化和反序列化方式进行数据写入和读取操作,如以下代码所示。
![img](https://epubservercos.yuewen.com/171F30/18519308908425106/epubprivate/OEBPS/Images/txt004_1.jpg?sign=1739928275-E0RDFc6gXzoH5GJuDeNpXTwL3arJXEhf-0-9441a352ae734049308ed833839669c8)
2)自定义类实现Serializable,同时包含readObject和writeObject方法,使用自定义的序列化和反序列化方式进行数据写入和读取操作。readObject方法和writeObject方法的可见性没有限制,可以是private、protected、default、public,如以下代码所示。
![img](https://epubservercos.yuewen.com/171F30/18519308908425106/epubprivate/OEBPS/Images/txt004_2.jpg?sign=1739928275-yy9FQrImGvbGOTIPXsLb887FEzmZjV2W-0-b856f0c77cbeb64cde50e9bfe2e47d3d)
3)自定义类实现Externalizable,通过覆盖readExternal方法和writeExternal方法来实现序列化和反序列化功能。readExternal方法和writeExternal方法的可见性没有限制,可以是private、protected、default、public。此外,还需要定义无参构造函数,如以下代码所示。
![img](https://epubservercos.yuewen.com/171F30/18519308908425106/epubprivate/OEBPS/Images/txt004_3.jpg?sign=1739928275-SqCiXSDtvQNB6e6Qz2uvylldyRwzG9J3-0-5d01a0b3130e95e8ef18fb28286537fc)
2.1.2 Java序列化应用
Java序列化输出通过ObjectOutputStream来实现,应用案例如以下代码所示。
![img](https://epubservercos.yuewen.com/171F30/18519308908425106/epubprivate/OEBPS/Images/txt004_4.jpg?sign=1739928275-a2JVRm4UpxiOQBU9MhFjv42TeOSGLZtX-0-b5ac041eb72300dc1bda79d7dc96afe2)
![img](https://epubservercos.yuewen.com/171F30/18519308908425106/epubprivate/OEBPS/Images/txt004_5.jpg?sign=1739928275-u09tGsT7S1MHyHO6Eed2LmMaUd9klG3H-0-821dcbb1a0d59bade1e39e9fac04096f)
通过上述代码可以看出,Java序列化使用起来很简洁。结合2.1.1节的内容,读者应该会有以下几个疑问:
1)自定义的Person类实现了Serializable,那么Serializable起什么作用呢?
2)Serializable和Externalizable有什么区别呢?什么场景使用Serializable?什么场景使用Externalizable?
3)为什么需要定义一个serialVersionUID常量,这个常量的意义是什么?(除此以外,这个常量的定义为什么不是全部大写?)
4)ObjectOutputStream调用writeObject方法就实现了对象序列化功能,writeObject方法在内部做了什么事情使得Java序列化应用起来如此简洁?
带着这些疑问,我们开始深入了解Java序列化技术的原理。