简介
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 |
结论
-
protobuf 不管是处理时间上,还是空间占用上都优于现有的其他序列化方式。内存暂用是java 序列化的1/9,时间也是差了一个数量级,一次操作在1us左右。缺点:就是对象结构体有限制,只适合于内部系统使用。
-
json格式在空间占用还是有一些优势,是java序列化的1/2.6。序列化和反序列化处理时间上差不多,也就在5us。当然这次使用的jackson,如果使用普通的jsonlib可能没有这样好的性能,jsonlib估计跟java序列化差不多。
-
xml相比于java序列化来说,空间占用上有点优势,但不明显。处理时间上比java序列化多了一个数量级,在100us左右。
-
hessian测试有点意外,具体序列化数据上还步入json。性能上也不如jackjson,输得比较彻底。
-
hessian使用压缩,虽然在字节上有20%以上的空间提升,但性能上差了4,5倍,典型的以时间换空间。总的来说还是google protobuf比较给力
-
对性能敏感,对开发体验要求不高的内部系统选 thrift/protobuf ;对开发体验敏感,性能有要求的内外部系统选 hessian2 ;对序列化后的数据要求有良好的可读性选 jackson/gson/xml
参考资料
-
protobuf的小例子 https://github.com/moguangquan/CodeUtil/tree/master/protobuf