通讯协议序列化解读(一) Protobuf详解教程

前言:说到JSON可能大家很熟悉,是目前应用最广泛的一种序列化格式,它使用起来简单方便,而且拥有超高的可读性。但是在越来越多的应用场景里,JSON冗长的缺点导致它并不是一种最优的选择。

一、常用序列化格式介绍

目前JAVA常用的序列化有protobuf,json,xml,Serializable,hessian,kryo。他们的优缺点如下:

JSON:不多说了,用途广泛,序列化方式还衍生了阿里的fastjson,美团的MSON,谷歌的GSON等更加优秀的转码工具。
优点:使用方便。
缺点:数据冗长,转码性能一般。

XML:很久之前的转码方法了,现在用的不多。
优点:暂时没发现。
缺点:数据冗长,转码性能一般。

Serialzable:JDK自带的序列化。
优点:使用方便。
缺点:转码性能低下。

hessian:基于 binary-RPC实现的远程通讯library,使用二进制传输数据。
优点:数据长度小。
缺点:性能低下。

通讯协议序列化解读(一) Protobuf详解教程

说了这么多,全是性能低下,MMP一群智障儿?当然不是!kryo就是一款快速、高效的序列化框架,但是它不是我们今天的主角,因为他只能在java中使用,和前端非java语言的通讯就存在极大的隔阂。我们今天的主角是protobuf?emmm,算是吧,但是也不全是,先给大家说下protobuf吧。

protobuf:谷歌公司出的一款开源项目,性能好,效率高,并且支持多种语言,例如:java,C++,python等。

    优点:转码性能高,支持多语言。
    缺点:中文文档少,使用相对复杂。




二、protobuf详解

在使用protobuf之前,需要安装protobuf编译器和运行时环境。
由于protobuf是跨平台,跨语言的,所以需要下载和安装对应版本的编译器和运行时依赖。

2.1 proto语法介绍

.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  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyxgj.html