原创不易,转载请注明出处:
https://blog.csdn.net/q258523454/article/details/129953047
一、实测数据
大家可以先看一组,我实测的数据,只对比我们常用的4种方式:jackson、fastjson、kryo、protostuff。
测试条件:
CPU: i7 2.80GHz
内存: 16GB
系统: 64位
备注:
每次插入1个 StudentObject, 每个 StudentObject中含有 100000 个 Student 对象
600次,共6000万个对象,实测数据.
方式 | 序列化 | 反序列化 | 存储大小 |
fastjson | 70 ms | 43 ms | 4.3 M |
jackson | 68 ms | 135 ms | 7.6 M |
kryo | 19 ms | 20 ms | 1.7 M |
protoStuff | 14 ms | 30 ms | 2.1 M |
首选: kryo,其次 protoStuff
二、序列化效率、反序列化效率、对象大小、综合性能
排名 | 序列化效率 | 反序列化效率 | 对象大小 | 综合性能 |
1 | protostuff | java-manual | kryo-opt | kryo-manual |
2 | protostuff-manual | wobly | kryo-manual | protostuff-manual |
3 | protobuf/protostuff | kryo-manual | kryo-flat-pre | protostuff |
4 | kryo-manual | fst-flat-pre | avro-generic | protobuf/protostuff |
5 | protostuff-runtime | protostuff-manual | avro-specific | java-manual |
6 | kryo-flat-pre | wobly-compact | wobly-compact | wobly |
7 | fst-flat-pre | protobuf/protostuff | msgpack-databind | fst-flat-pre |
8 | protobuf/protostuff-runtime | protostuff | msgpack-manual | protostuff-runtime |
9 | kryo-flat | protobuf/protostuff-runtime | protobuf/protostuff | protobuf/protostuff-runtime |
10 | java-manual | protostuff-runtime | protobuf | wobly-compact |
11 | wobly | protostuff-graph | protostuff-graph | protostuff-graph |
12 | protostuff-graph | protobuf | protostuff-manual | kryo-flat-pre |
13 | msgpack-manual | protostuff-graph-runtime | protostuff | protostuff-graph-runtime |
14 | protostuff-graph-runtime | thrift-compact | thrift-compact | kryo-flat |
15 | smile/jackson/manual | kryo-flat-pre | protobuf/protostuff-runtime | fst-flat |
16 | wobly-compact | kryo-flat | protostuff-graph-runtime | protobuf |
17 | fst-flat | fst-flat | protostuff-runtime | kryo-opt |
18 | kryo-opt | kryo-opt | fst-flat-pre | json/fastjson/databind |
19 | json/jackson/manual | scala/sbinary | wobly | smile/jackson/manual |
20 | json/fastjson/databind | json/fastjson/databind | java-manual | scala/sbinary |
21 | msgpack-databind | thrift | scala/sbinary | thrift-compact |
22 | protobuf | jboss-marshalling-river-ct-manual | kryo-flat | json/jackson/manual |
23 | json/protostuff-manual | kryo-serializer | kryo-serializer | jboss-marshalling-river-ct-manual |
24 | cbor/jackson/databind | fst | jboss-marshalling-river-ct-manual | fst |
25 | cbor/jackson/manual | smile/jackson/manual | jboss-marshalling-river-ct | kryo-serializer |
26 | smile/jackson/databind | json/jackson/manual | fst-flat | msgpack-manual |
27 | fst | msgpack-manual | fst | thrift |
28 | avro-specific | cbor/jackson/manual | xml/exi-manual | cbor/jackson/manual |
29 | json/jackson/databind | smile/jackson+afterburner/afterburner | smile/jackson/databind | msgpack-databind |
30 | scala/sbinary | msgpack-databind | smile/jackson/manual | cbor/jackson/databind |
三、总结
Kryo——速度快,序列化后体积小;缺点是跨语言支持较复杂
Protostuff——速度快,基于protobuf;缺点是需静态编译
Protostuff-Runtime,无需静态编译,但序列化前需预先传入schema;缺点是不支持无默认构造函数的类,反序列化时需用户自己初始化序列化后的对象,其只负责将该对象进行赋值
Java——使用方便,可序列化所有类;缺点是速度慢,占空间
具体的对比可以参考这个基线图:
Results - JVM Serializer Benchmarks
效率对比直观图:
首选序列化:Kryo、Protostuff