![深入理解序列化与反序列化](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=1739510480-A24cidUAVbXXQk32UjeudKMuLu910HPx-0-cbbbae480266bffc25fc9d3f1883a420)
2)自定义类实现Serializable,同时包含readObject和writeObject方法,使用自定义的序列化和反序列化方式进行数据写入和读取操作。readObject方法和writeObject方法的可见性没有限制,可以是private、protected、default、public,如以下代码所示。
![img](https://epubservercos.yuewen.com/171F30/18519308908425106/epubprivate/OEBPS/Images/txt004_2.jpg?sign=1739510480-yqvYuNr8kEpTRrZSvWnnNVuSa8ZDVsPt-0-bfe743a95eca8c5fb352f0db2b866ec1)
3)自定义类实现Externalizable,通过覆盖readExternal方法和writeExternal方法来实现序列化和反序列化功能。readExternal方法和writeExternal方法的可见性没有限制,可以是private、protected、default、public。此外,还需要定义无参构造函数,如以下代码所示。
![img](https://epubservercos.yuewen.com/171F30/18519308908425106/epubprivate/OEBPS/Images/txt004_3.jpg?sign=1739510480-BNqVdzprD4NTUvX0L3WDOZsp2QZ6sOlE-0-74e6517e89c63ce24c4455243faec552)
2.1.2 Java序列化应用
Java序列化输出通过ObjectOutputStream来实现,应用案例如以下代码所示。
![img](https://epubservercos.yuewen.com/171F30/18519308908425106/epubprivate/OEBPS/Images/txt004_4.jpg?sign=1739510480-QZduOHRfLMp3w83Er7NL1eIIhHN5Vg38-0-e6f36f66516b56e35ec0a8728cd32b03)
![img](https://epubservercos.yuewen.com/171F30/18519308908425106/epubprivate/OEBPS/Images/txt004_5.jpg?sign=1739510480-8w6kMwzIuDClZ6e8qGdma8Tq4ahXe5Cg-0-b8dee1e81cde9fb9594e8d205e7f3f05)
通过上述代码可以看出,Java序列化使用起来很简洁。结合2.1.1节的内容,读者应该会有以下几个疑问:
1)自定义的Person类实现了Serializable,那么Serializable起什么作用呢?
2)Serializable和Externalizable有什么区别呢?什么场景使用Serializable?什么场景使用Externalizable?
3)为什么需要定义一个serialVersionUID常量,这个常量的意义是什么?(除此以外,这个常量的定义为什么不是全部大写?)
4)ObjectOutputStream调用writeObject方法就实现了对象序列化功能,writeObject方法在内部做了什么事情使得Java序列化应用起来如此简洁?
带着这些疑问,我们开始深入了解Java序列化技术的原理。