protobuf序列化协议

Reading time ~13 minutes

简介

protobuf :多客户端语言支持、异构、速度快、传输字节少,但可读性不好,开发有些复杂

jackson :开发友好、跨平台、可配置可注解、效率次于protobuf,传输字节比protobuf多些

Serializable :java原生,开发简单,但不能异构,效率慢

hessian :使用简单,跨语言、传输字节少,但效率一般般,开发要注意传输的对象需实现Serializable接口

测试

这里主要比较下google protobuf协议,json,xml,java序列化相关的数据的性能

//Object source 序列化和反序列化的对象
//TestCallback callback 接口,声明了序列化writeObject()和反序列化readObject()
for (int i = 0; i < 500000; i++) {  //测试次数为500000次
    byte[] bytes = callback.writeObject(source);  //序列化
    size = size + bytes.length;
    callback.readObject(bytes);  //反序列化
    bytes = null;
}

// -------------Serializable的序列化和反序列化方法
new TestCallback() {
    @Override
    public byte[] writeObject(Object source) {
        try {
            ByteArrayOutputStream bout = new ByteArrayOutputStream();
            ObjectOutputStream output = new ObjectOutputStream(bout);
            output.writeObject(source);
            return bout.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public Object readObject(byte[] bytes) {
        try {
            ByteArrayInputStream bin = new ByteArrayInputStream(bytes);
            ObjectInputStream input = new ObjectInputStream(bin);
            return input.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
//-----------------

结果

  protobuf jackson xstream Serializable hessian2 hessian2压缩 hessian1
序列化(单位ns) 1154 5421 92406 10189 26794 100766 29027
反序列化(单位ns) 1334 8743 117329 64027 37871 188432 37596
bytes 97 311 664 824 374 283 495

结论

  1. protobuf 不管是处理时间上,还是空间占用上都优于现有的其他序列化方式。内存暂用是java 序列化的1/9,时间也是差了一个数量级,一次操作在1us左右。缺点:就是对象结构体有限制,只适合于内部系统使用。

  2. json格式在空间占用还是有一些优势,是java序列化的1/2.6。序列化和反序列化处理时间上差不多,也就在5us。当然这次使用的jackson,如果使用普通的jsonlib可能没有这样好的性能,jsonlib估计跟java序列化差不多。

  3. xml相比于java序列化来说,空间占用上有点优势,但不明显。处理时间上比java序列化多了一个数量级,在100us左右。

  4. hessian测试有点意外,具体序列化数据上还步入json。性能上也不如jackjson,输得比较彻底。

  5. hessian使用压缩,虽然在字节上有20%以上的空间提升,但性能上差了4,5倍,典型的以时间换空间。总的来说还是google protobuf比较给力

  6. 对性能敏感,对开发体验要求不高的内部系统选 thrift/protobuf ;对开发体验敏感,性能有要求的内外部系统选 hessian2 ;对序列化后的数据要求有良好的可读性选 jackson/gson/xml

参考资料

  1. 几种序列化协议(protobuf,xstream,jackjson,jdk,hessian)相关数据对比

  2. protobuf的小例子 https://github.com/moguangquan/CodeUtil/tree/master/protobuf

jdk-timer、spring-task、quartz的比较

这篇文章将简单介绍目前常用的定时任务框架! Continue reading

小岛经济学-读书笔记

Published on May 10, 2018

java常见的http请求库

Published on May 05, 2018