4.1.3.1. 编解码技术

JDK自带ObjectInputStreamObjectOutputStream 可以直接把 Java对象作为可存储的自己数组写入文件,也可以传输到网络上。提升了程序员的开发效率,避免操作底层的自己数组。

Java序列化的目的有两个:

  1. 网络传输
  2. 对象持久化

由于JDK自带序列化有种种缺陷,所以就衍生出了各种序列化框架。

本章主要内容包括:

  1. Java序列化的缺点
  2. 业界留下的几种编解码框架介绍

4.1.3.1.1. Java序列化的缺点

  1. 无法跨语言
  2. 序列化后的码流太大 :

    评判一个编解码框架的优劣时,往往会参考以下一个因素

    1. 是否支持跨语言,支持的语言种类是否丰富
    2. 编码后的码流大小
    3. 编解码的性能
    4. 类库是否小巧,API使用是否方便
    5. 使用者需要手动开发的工作量和难度。

      如果编码后的字节数组越大,存储的时候就占空间,网络传输更占带宽。 测试方法:二进制编解码

      使用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);
      
  3. 序列化性能太低

    测试方法:大量循环(如100万次)调用序列化方法,查看各自所耗费时间

4.1.3.1.2. 业界主流的编解码框架

4.1.3.1.2.1. Google 的 Protobuf介绍

全称 Google Protocol Buffers,由谷歌开源而来,数据结构以.proto文件进行描述,通过代码生成工具可以生成对应数据结构的POJO对象 和 Protobuf 相关的方法和属性

特点:

  1. 结构化数据存储格式(XML,JSON 等)
  2. 高效的编解码性能
  3. 语言无关、平台无关、扩展性好
  4. 官方支持Java、C++ 和 Python 三种语言

4.1.3.1.2.2. Facebook 的 Thrift

4.1.3.1.2.3. JBoss Marshalling

© All Rights Reserved            updated 2017-02-27 17:56:54

results matching ""

    No results matching ""