“这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战” 今天我们来聊聊序列化:
序列化
Java是面向对象的语言,与其他语言进行交互(比如与前端js进行http通信),需要把对象转化成一种通用的格式比如json(前端显然不认识Java对象),从对象到json字符串的转换,就是序列化的过程,反过来,从json字符串转换成Java对象,就是反序列化的过程。
首先来想一个问题,我们为什么要序列化?
因为数据传输过程中,是经过二进制的字节序列传输的;
序列化的本质:
Java对象 ----->二进制 --->可传输的对象的字节序列
在进程数据传输的过程中,A进程将Java对象发送给B进程;
反序列化与序列化的区别
序列化: Java对象在网络上便于存储,运输 反序列化:将对象的字节序列,转化成Java对象
场景: 我们前端将参数序列化之后,传递给后台接口的入参, 调用方式时,我们会将入参重新解析成一个对象,传入方法进行调用;
对象序列化的两种用途
-
对于普通的序列化,一般是利用Java对象 序列化成对象字节序列,从而完成二进制文件写入,存储到硬盘;
-
在网络上传递数,使用对象的字节序列,二进制
如何保证序列化的安全
默认都会有一个serialVersionUID,作为序列化的接口标识
Java的对象,默认在网络中传输实现序列化的接口java.io.Serializable;
具体的序列化过程是这样的:
序列化操作的时候系统会把当前类的serialVersionUID写入到序列化文件中,当反序列化时系统会去检测文件中的serialVersionUID,判断它是否与当前类的serialVersionUID一致,如果一致就说明序列化类的版本与当前类版本是一样的,可以反序列化成功,否则失败。
如何生成一个serialVersionUID?
我们可以利用IDEA 自带的功能:
File/settings
设置之后,选中对应的类名,然后按 alt+enter 快捷键 的情况如下所示
private static final long serialVersionUID = 3382984904663045220L;
就会生成一个序列化ID,作为序列化时使用;