什么是 Protobuf ?
谷歌推出的一种序列化协议 ,是一种语言无关、平台无关、可扩展的序列化结构数据的方法
什么是序列化?
把对象转换为字节序列的过程称为对象的序列化
为什么要把对象转换为字节序列?
以便存储在文件中或在网络上传输。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
进入正题
Protobuf优点:
- 语言无关、平台无关。即 ProtoBuf 支持 Java、C++、Python 等多种语言,支持多个平台
- 高效。即比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单
- 扩展性、兼容性好。你可以更新数据结构,而不影响和破坏原有的旧程序
Protobuf的数据序列化能力 > JSON、XML
开始使用
1.首先准备工具 jar包 protoc.exe执行文件
2.编写 Protobuf的配置文件
3.通过编写脚本使用protoc.exe生成 java文件
工具包连接:下载工具包 提取码:pugf
使用
1.新建文件 test.proto
syntax = "proto3";// 指定protobuf版本
option java_package="com.duihua"; // 指定包名
option java_outer_classname="UserPB";//指定生成的类名
message PBTest{
required int64 id=1; //id
required int32 age=2; //age
required string name=3; //name
}
这样一个简单的配置文件就写好了,
syntax = “proto3”:指定protobuf版本
option java_package=“com.duihua”;: 指定包名
option java_outer_classname=“UserPB” //指定生成的类名
下面的大家可能陌生
-
message 好比 java中的 class
-
required 表示字段类型必须设置
-
int64 对应java中的long
-
等号后面的数字为key值,这些key在同一个message下不能重复
2.编写脚本 新建 build.bat
protoc ./test.proto --java_out=./
pause
protoc:表示使用 protoc.exe 执行
./test.proto :表示 当前目录下的 test.proto 也就是我们刚刚编写的
java_out: 表示生成java文件
./:表示 生成到当前目录
编写好后 双击运行 我们就会看到生成的文件了,这就是我们需要的 Protobuf的java文件
工具包中的jar包 ,放入 libs文件下 添加到项目中
/**
* 序列化
*/
public static byte[] toBytes(){
//获取一个PBPlayer的构造器
Builder builder = UserPB.PBTest.newBuilder();
//设置数据
builder.setPlayerId(101).setAge(20).setName("duihua");
//构造出对象
PBTest player = builder.build();
//序列化成字节数组
byte[] byteArray = player.toByteArray();
System.out.println(Arrays.toString(byteArray));
return byteArray;
}
/**
* 反序列化
*/
public static void toPlayer(byte[] bs) throws Exception{
PBTest player = UserPB.PBTest.parseFrom(bs);
System.out.println("Id:" + player.getPlayerId());
System.out.println("age:" + player.getAge());
System.out.println("name:" + player.getName());
}