Netty学习07-protobuf序列化学习

Protobuf是一个灵活的、高效的用于序列化数据的协议。相比较XML和JSON格式,protobuf更小、更快、更便捷。Protobuf是跨语言的,并且自带了一个编译器(protoc),只需要用它进行编译,可以编译成Java、python、C++等代码,然后就可以直接使用,不需要再写其他代码,自带有解析的代码。

protobuf协议是以一个 .proto 后缀的文件为基础,这个文件描述了存在哪些数据,数据类型是怎么样的。

修饰符
required :  不可以增加或删除的字段,必须初始化;
optional :   可选字段,可删除,可以不初始化;
repeated :  可重复字段, 对应到java文件里,生成的是List。

protobuf序列化原理:

protobuf的message中有很多字段,每个字段的格式为:
修饰符 字段类型 字段名 = 域号;

在序列化时,protobuf按照TLV的格式序列化每一个字段,T即Tag,也叫Key;V是该字段对应的值value;L是Value的长度,如果一个字段是整形,这个L部分会省略。

protobuf协议使用二进制格式表示Key字段;对value而言,不同的类型采用的编码方式也不同,如果是整型,采用二进制表示;如果是字符,会直接原样写入文件或者字符串(即不编码)。

因为protobuf对int类型做了特殊处理,不同于其他的序列化协议,protobuf对int类型的存储用1-5个字节,下面简单介绍下对Int类型的解析:

value的字节当中,第一位标识是否需要拓展到下一个字节,1代表需要,0代表不需要。

如果标识的数据值小于2的7次方(小于128)时,则可以用一个字节标识,否则需要多个字节。

Netty学习07-protobuf序列化学习

总结:

protobuf之所以相对于json能否节省传输数据,原因有如下几点

1、针对int类型,采取了变长的传输方式。json传输int都是4个字节传输

2、不传输属性字段名(属性名长度多少就是几个字节),取而代替的是int类型的tag值(基本都是1个字节)。

3、不传输多余的字符,比如json中分割数据的{,"等等。

 

参考:

https://blog.csdn.net/chengzi_comm/article/details/53199278

https://blog.csdn.net/rzleilei/article/details/100187104