Java序列化可以将对象转换为二进制序列,以方便对象持久化和网络传输。
基本用法
要实现序列化的对象必须实现java.io.Serializable这个接口,并借助IDE生成serialVersionUID变量。Java的序列化机制通过判断类的serialVersionUID来验证版本一致。我们可以通过ObjectOutputStream和ObjectInputStream来对对象进行读取和写入。
在序列化过程中,如果对象引用了其他对象,那么显然不可能去将其内存地址进行序列化。每个对象都有一个独一无二的序列号,是该对象的唯一标识:
- 对于每个对象,当第一次遇到时,保存其数据到流中。
- 如果该对象已经被保存过了,则只存储其序列号。
缺点
Java序列化存在三个致命缺点,导致其不适用于网络传输:
- 无法跨语言:在网络传输中,经常会有异构语言的进程的交互,但Java序列化技术是Java语言内部的私有协议,其他语言无法进行反序列化。目前所有流行的RPC框架都没有使用Java序列化作为编解码框架。
- 序列化后的码流太大
- 序列化的性能较低
每日学习笔记,写于2020-05-21 星期四