今天看ArrayList的源代码,发现了里面的一个关键字transient
然后查了一下,发现这个关键字是用来防止序列化的
那什么是序列化呢?我又懵逼了
为什么需要序列化?
在当今的网络社会,我们需要在网络上传输各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都是以二进制序列的形式在网络上传送的,那么发送方就需要将这些数据序列化为字节流后传输,而接收方接到字节流后需要反序列化为相应的数据类型。当然接收方也可以将接收到的字节流存储到磁盘中,等到以后想恢复的时候再恢复。
综上,可以得出对象的序列化和反序列化主要有两种用途:
把对象的字节序列永久地保存到磁盘上。(持久化对象)
可以将Java对象以字节序列的方式在网络中传输。(网络传输对象)
通过Serializable或Externalizable来使数据序列化
serialVersionUID
由于反序列化Java对象的时候,必须提供该对象的class文件,但是随着项目的升级class文件文件也会升级,Java如何保证兼容性呢?答案就是 serialVersionUID。每个可以序列化的类里面都会存在一个serialVersionUID,只要这个值前后一致,即使类升级了,系统仍然会认为他们是同一版本。如果我们不显式指定一个,系统就会使用默认值。
tips:1. 父类可以被序列化,子类就可以被序列化
2.子类被序列化,父类就不可以