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