如果我们需要持久化 Java 对象比如将 Java 对象保存在文件中,或者在网络传输 Java 对象。这样的情况就需要序列化。
- 序列化:将数据结构或对象转换成二进制字节流的过程
- 反序列化:将在序列化过程中生成的二进制字节流转换成数据结构或者对象的过程
对于Java来讲,我们序列化的都是对象,就是实例化的类。
常见应用场景
- 对象在网络传输之前先被序列化,接收到序列化的对象之后需要在进行反序列化。
- 将对象存储到文件之前进行序列化,读取出文件进行反序列化。
- 可以理解入围序列化,出围反序列化。
序列化的主要目的就是把汉堡包(JAVA对象)装进包装盒(序列化),卖给顾客(网路传输,存储文件,数据库,内存)。顾客再将汉堡撕去包装膜(反序列化)使用。
····································································································································
序列化协议对应于 TCP/IP 4 层模型的哪一层?
我们知道网络通信的双方必须要采用和遵守相同的协议。TCP/IP 四层模型是下面这样的,序列化协议属于哪一层呢?
1.应用层
2.传输层
3.网络层
4.网络接口层
OSI 七层协议模型中,表示层做的事情主要就是对应用层的用户数据进行处理转换为二进制流。反过来的话,就是将二进制流转换成应用层的用户数据。这不就对应的是序列化和反序列化么?
应用层、表示层和会话层对应的都是 TCP/IP 四层模型中的应用层,所以序列化协议属于 TCP/IP 协议应用层的一部分。
为什么不推荐使用 JDK 自带的序列化?
主要原因有下面这些原因:
- 不支持跨语言调用 : 如果调用的是其他语言开发的服务的时候就不支持了。
- 性能差 :相比于其他序列化框架性能更低,主要原因是序列化之后的字节数组体积较大,导致传输成本加大。
- 存在安全问题 :序列化和反序列化本身并不存在问题。但当输入的反序列化的数据可被用户控制,那么攻击者即可通过构造恶意输入,让反序列化产生非预期的对象,在此过程中执行构造的任意代码。