1.什么是protobuf
Protocal Buffers(简称protobuf)是谷歌的一项技术,用于结构化的数据序列化、反序列化。
protobuf功能是把某种数据结构的信息以某种格式保存起来。它主要用于文件存储以及传输协议格式等场合。
(什么是序列化,反序列化:Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。将程序中的对象,放入文件中保存就是序列化,将文件中的字节码重新转成对象就是反序列化。)
类似的还有 XML、Json、Java 的 Serializable
但protobuf的效率高于XML、Json,不过protobuf生成的是字节码,可读性相比之略差
它们的具体差别如下图:
2.protobuf 的编译器下载与环境的配置
编译器下载
编译器下载地址:https://github.com/protocolbuffers/protobuf/releases
(我这里下载的是protoc-3.15.3-win64)
配置环境变量
path 系统变量中增加配置,也就是你的解压文件位置
(我这里是D:\protoc\bin)
检查是否配置成功
cmd之后输入
protoc --version检查版本号
3. 在idea中使用protobuf
安装这两个插件即可,安装之后重启 idea
一个是根据 .proto 文件来生成 proto 对象
一个是使得 idea 支持我们的 proto 语法,例如关键词高亮等功能
工具栏会出现这两个选项
配置全局 protobuf
protoc path :我们下载的 protobuf 编辑器的位置,在 bin 目录下有一个 .exe 文件
quick gen : 对应的语言,这里选择Java
4.写一个简单的protoc
首先创建一个简单的springboot项目或者maven项目
引入依赖
<!-- protobuf 支持 Java 核心包-->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.15.3</version>
</dependency>
<!-- proto 与 Json 互转会用到-->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
<version>3.15.3</version>
</dependency>
gradle 版本
compile 'com.google.protobuf:protobuf-java:3.15.3'
compile 'com.google.protobuf:protobuf-java-util:3.15.3'
开始编写proto文件
在 resource 资源文件夹下面创建一个 proto 文件夹
新建一个 demo.proto
内容如下
//使用 proto3 语法 ,未指定则使用proto2
syntax = "proto3";
//生成 proto 文件所在包路径
package com.wxw.notes.protobuf.proto;
//生成 proto 文件所在包路径
option java_package = "com.wxw.notes.protobuf.proto";
//生成 proto 文件名
option java_outer_classname="DemoProto";
message Demo{
//自身属性
int32 id = 1;
string code = 2;
string name = 3;
}
红色标识,千万不要以为是我们 Java 里面的异常错误,这只是 proto 的语法高亮
生成 proto 对象
选中我们新建的.proto 文件,右键,选择框中的选项就可以生成了
protobuf 序列化和反序列化
package com.wxw.notes.protobuf.test;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.MessageOrBuilder;
import com.google.protobuf.TextFormat;
import com.google.protobuf.util.JsonFormat;
import com.wxw.notes.protobuf.proto.DemoProto;
import java.util.Arrays;
public class SimpleTestMain {
public static void main(String[] args) {
//初始化数据
DemoProto.Demo.Builder demo = DemoProto.Demo.newBuilder();
demo.setId(1)
.setCode("001")
.setName("张三")
.build();
//序列化
DemoProto.Demo build = demo.build();
//转换成字节数组
byte[] s = build.toByteArray();
System.out.println("protobuf数据bytes[]:" + Arrays.toString(s));
System.out.println("protobuf序列化大小: " + s.length);
DemoProto.Demo demo1 = null;
String jsonObject = null;
try {
//反序列化
demo1 = DemoProto.Demo.parseFrom(s);
//转 json
jsonObject = JsonFormat.printer().print(demo1);
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
System.out.println("Json格式化结果:\n" + jsonObject);
System.out.println("Json格式化数据大小: " + jsonObject.getBytes().length);
}
运行之后
至此一个简单的proto就写好了