什么是序列化?
序列化是将对象转换成可存储或者变成不同传输格式的过程。可以被转成字节流以二进制形式存储或者是其他形式的数据流。
为什么要序列化?
1.数据持久性,当我们关闭应用程序后,我们在缓存中的对象就会消失,当我们需要再次使用的时候,我们需要重新创建,非常麻烦,所以我们可以将对象序列化后保存在文件或者数据库当中。
2.网络传输的时候,对象要以字节流的形式进行传输,所以序列化成字节流,可以在网络或者进程间进行通信传输。
3.在不同的平台上,我们可以把对象转换成json或者xml这种通用的数据格式,这样对象就可以在不同的平台和编程语言之间进行交互和传递。
案例
标记接口(Serializable),实现该接口代表该类可以实例化,并且该类的子类也可以实现序列化
一个类继承了Serialiable接口,则里面的属性都应该是可序列化的,如果一个类里面的部分序列不是可序列化,可以使用transient或者static关键字修饰
通过序列化把对象转换成字节流储存在计算机硬盘中
通过反序列化把硬盘中的数据重新建立成一个对象在内存中开辟地址
当反序列化有多个对象时
数组
在反序列化读取文件的时候,会出现不知道文件有多少个对象,而无法确认使用多少次循环获取这个文件的对象,这时候可以使用异常来判断,当出现异常,则证明对象已经反序列化完毕,但是这种方法不可取,因为会导致程序中断。
集合
通过集合无须进行判断,把得到的对象转成我们的类型为Employee的集合,然后遍历输出。
反序列化注意的问题
- 类的版本号和文件流的版本号不匹配,把对象写入文件之后,再次修改类中的属性,并且不重新写入文件,此时类的默认版本号就会发生改变,在反序列化读文件的时候就会出现文件和类的序列号不匹配问题
- 就算加了版本号,如果改变了已经写入文件的属性的类型,导致文件里的属性类型和类的属性类型不匹配也会出现异常
- 实体类一定要有空参构造器
在开发中的案例
1.可以使用序列化来保存用户的配置设置:一个文本编译器可以使用序列化将用户的偏好设置(字体,颜色,大小等)保存在本地文件中在下次启动时无须重新设置,可以直接加载这些配置。
2.或者在网络聊天应用中,可以序列化将消息传输到服务器,传输给其他用户。