4.1.3.1. 编解码技术
JDK自带ObjectInputStream
和 ObjectOutputStream
可以直接把 Java对象作为可存储的自己数组写入文件,也可以传输到网络上。提升了程序员的开发效率,避免操作底层的自己数组。
Java序列化的目的有两个:
- 网络传输
- 对象持久化
由于JDK自带序列化有种种缺陷,所以就衍生出了各种序列化框架。
本章主要内容包括:
- Java序列化的缺点
- 业界留下的几种编解码框架介绍
4.1.3.1.1. Java序列化的缺点
- 无法跨语言
序列化后的码流太大 :
评判一个编解码框架的优劣时,往往会参考以下一个因素
- 是否支持跨语言,支持的语言种类是否丰富
- 编码后的码流大小
- 编解码的性能
- 类库是否小巧,API使用是否方便
使用者需要手动开发的工作量和难度。
如果编码后的字节数组越大,存储的时候就占空间,网络传输更占带宽。 测试方法:二进制编解码
使用JDK自带类,然后得到byte的长度。 再和 序列化框架得到的长度对比: ByteBuffer buffer = ByteBuffer.allocate(1024); buffer.putInt(1); buffer.put("hello".getBytes()); buffer.putInt(100); buffer.flip(); byte[] bytes = new byte[buffer.remaining()]; buffer.get(bytes); System.out.println(bytes.length);
序列化性能太低
测试方法:大量循环(如100万次)调用序列化方法,查看各自所耗费时间
4.1.3.1.2. 业界主流的编解码框架
4.1.3.1.2.1. Google 的 Protobuf介绍
全称 Google Protocol Buffers
,由谷歌开源而来,数据结构以.proto
文件进行描述,通过代码生成工具可以生成对应数据结构的POJO
对象 和 Protobuf
相关的方法和属性
特点:
- 结构化数据存储格式(XML,JSON 等)
- 高效的编解码性能
- 语言无关、平台无关、扩展性好
- 官方支持Java、C++ 和 Python 三种语言