简介
protocol buff是一种协议,是谷歌推出的一种序列化协议
Java序列化协议也是一种协议
两者的目的是,将对象序列化成字节数组,或者说是二进制数据
准备
protobuf的两个jar包、 protoc.exe(生成java的源代码,需要写protobuf的配置文件才能生成。)
protobuf配置文件
任意目录新建文件夹(任意名字)==》新建proto文件(任意名字,例如player.proto)后缀为proto
1 | //包名 |
生成java代码
将上面的player.proto放到protoc.exe的同级目录===》在这个目录中新建build.bat
build.bat
1 | //如果是生成c代码就是--cpp_out |
点击build.bat会自动生成一个文件加com.proto ===》PlayerModule.java
举个🌰
新建项目==》libs用来放jar包==》新建proto目录用来放proto文件==》把上面的两个jar拷贝过去 ==》proto文件拷贝到proto目录中==》protoc.exe和build.bat拷贝到项目根目录
修改build.bat
1 | protoc ./proto/*.protp --java_out=./src |
在src下新建PB2Bytes.java
1 | package com.java; |
输出
1 | [8,101,16,20,16,5,112,101,116,101,114,32,-23,7] |
java序列化和反序列化
Player.java
1 | package com.java; |
JAVA2Bytes.java
1 | package com.java; |
输出
1 | [-84,-19,0,5,115,114,0,15,99,111,109,46,106,97,118,97,46,80,108........] |
不同
java序列化出来的字节数组比proto buff的长很多,字节数组短的话能够减少很多的带宽。
为什么?
java中的字节数组包括这个类的类信息、这个类有哪个字段、协议头、每个类叫什么名称、每个类是什么类型的、最后的数值是多少等。
proto buff不许要有配置文件,java不需要只要双方都是java就行,所以proto buff其实是把类的名称、类型、字段等都写到了配置文件中,所以在序列化的时候集成了这些描述信息,所以字节很短。
proto buff分配空间是有伸缩性的,比如int 在内存中是 4 个字节,proto buff根据实际大小分配1-5个字节,从概率学的角度讲大部分可能都是一个或者两个字节