前言:说到JSON可能大家很熟悉,是目前应用最广泛的一种序列化格式,它使用起来简单方便,而且拥有超高的可读性。但是在越来越多的应用场景里,JSON冗长的缺点导致它并不是一种最优的选择。
一、常用序列化格式介绍目前JAVA常用的序列化有protobuf,json,xml,Serializable,hessian,kryo。他们的优缺点如下:
JSON:不多说了,用途广泛,序列化方式还衍生了阿里的fastjson,美团的MSON,谷歌的GSON等更加优秀的转码工具。
优点:使用方便。
缺点:数据冗长,转码性能一般。
XML:很久之前的转码方法了,现在用的不多。
优点:暂时没发现。
缺点:数据冗长,转码性能一般。
Serialzable:JDK自带的序列化。
优点:使用方便。
缺点:转码性能低下。
hessian:基于 binary-RPC实现的远程通讯library,使用二进制传输数据。
优点:数据长度小。
缺点:性能低下。
说了这么多,全是性能低下,MMP一群智障儿?当然不是!kryo就是一款快速、高效的序列化框架,但是它不是我们今天的主角,因为他只能在java中使用,和前端非java语言的通讯就存在极大的隔阂。我们今天的主角是protobuf?emmm,算是吧,但是也不全是,先给大家说下protobuf吧。
protobuf:谷歌公司出的一款开源项目,性能好,效率高,并且支持多种语言,例如:java,C++,python等。
优点:转码性能高,支持多语言。
缺点:中文文档少,使用相对复杂。
在使用protobuf之前,需要安装protobuf编译器和运行时环境。
由于protobuf是跨平台,跨语言的,所以需要下载和安装对应版本的编译器和运行时依赖。
.proto Type
说明
C++ Type
Java Type
Python Type[2]
Go Type
double
double
double
float
float64
float
float
float
float
float32
int32
使用可变长度编码。对负数进行编码时比较低效 – 如果你的字段要使用负数值,请使用sint32来代替。
int32
int
int
int
int64
使用可变长度编码。对负数进行编码时比较低效 – 如果你的字段要使用负数值,请使用sint64来代替。
int64
long
int/long[3]
int64
uint32
使用可变长度编码
uint32
int[1]
int/long[3]
uint32
uint64
使用可变长度编码
uint64
long[1]
int/long[3]
uint64