一、什么是protocol buffers
Protocol buffers是一个灵活的、高效的、自动化的用于对结构化数据进行序列化的协议,与XML相比,Protocol buffers序列化后的码流更小、速度更快、操作更简单。你只需要将要被序列化的数据结构定义一次(译注:使用.proto文件定义),便可以使用特别生成的源代码(译注:使用protobuf提供的生成工具)轻松的使用不同的数据流完成对这些结构数据的读写操作,即使你使用不同的语言(译注:protobuf的跨语言支持特性)。你甚至可以更新你的数据结构的定义(译注:就是更新.proto文件内容)而不会破坏依赖“老”格式编译出来的程序。
Google Protocol Buffer(简称 Protobuf),Protocol Buffers 是一种与平台语言无关的序列化结构数据存储格式,可作为数据存储或 RPC 数据交换格式。总结优点有:
- 效率高: 序列化速度比xml,json快20~100倍,序列化后,体积可缩小3倍左右,所以它的传输速度更快了
- 使用简单安全: proto编译器自动实现序列化,传输过程中以十六进制字节传输,所以安全不怕黑
- 跨平台: 支持java、c#、c++、go 和 python等语言,只需维护一个.proto文件,然后通过相应的编译器就可以对同一数据进行序列化(打包)和反序列化(解包)。
二、【.proto】文件→【.java】文件
1. 首先介绍如何编写后缀名为.proto的文件,通常我们使用proto文件来定义结构化数据,在protobuf的术语中结构化数据被称为Message,如 message person { required string name=1; required int32 age=2; optional string email=3;},同时良好的命名习惯可以让我们清晰的通过文件名了解文件的信息,文件名的命名规则如下:packageName.MessageName.proto。
2. 编写.proto的文件,此处文件名为protomsg.ptoto
syntax = "proto3";
/* 指定正在使用proto3语法,若不指定,protocol buffer compiler默认使用proto2语法 */
package tutorial;
option java_package = "com.example.tutorial"; //java_package:指生成.java文件的包名
option java_outer_classname = "AddressBookProtos"; //java_outer_classname:指把.proto编译成.java后的文件名(即ProtoTest.java)
/*---------------- 类及其消息结构 ----------------*/
message Person{
required string name = 1; //required 修饰符表示name必须赋值(没有默认值)
required int32 id = 2;
optional string email = 3; //optional 修饰符表示选择性赋值,如果在后面添加[dafault = xx],例如:optional string email = 3;[dafault = 0]表示默认值是0
//required和optional可以有默认值
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
}
3. 在 protobuf官网 找到Java版本的页面, 页面详细描述了通过Maven,Gradle等构建工具使用protobuf的方法,当然也提到了如何编译出.jar
格式文件。
4. 在 release页面找到所需版本下载:此处使用编译器版本:
5. 将protoc-xxx-win32.zip文件解压,解压后的bin目录下有protoc.exe,是用来把proto文件编译成目标语言(C++,Java,Python)的文本,是google protobuf定义的格式。
6. 将已经写好的文件名为protomsg.proto文件复制到bin目录下。
7. 在Windows下为google protobuf配置环境变量,熟悉java的朋友都知道环境变量的配置,下面简单说一下步骤:
右击“这台电脑”-->“属性”-->“高级系统设置”-->“环境变量”-->修改“系统变量”Path的值即可。注意添加的Path值仅到bin目录下即可。
8. 将.proto文件转换为.java文件,打开cmd命令窗口,在cmd窗口执行以下命令:
格式:protoc -I=【源地址】 --java_out=【目标地址】 【源地址】/xxx.proto
此处生成时会以.proto文件里注明的java_package为路径生成,所以目标地址不必包含java_package及之后的路径
例如:protoc -I=. --java_out=. ./protomsg.proto
9. 生成的.java文件,如图:
三、protobuf源码打成jar包
1. 在 release页面找到所需版本下载:此处proto-java源码使用版本:
2. 将protoc-3.6.1-win32.zip解压之后,找到编译器文件protoc.exe
, 拷贝到
protobuf-java-3.6.1.zip解压之后生成的..\protobuf-3.6.1\src\
目录里面。
3. 确保系统中已经安装了Maven工具, 打开cmd命令行工具 ,进入到..\protobuf-3.6.1\java\
路径,执行下面的命令:
mvn package
编译时间大概一两分钟, 编译成功后,将在protobuf-3.6.1\java\core\target\
目录下看到刚刚生成的**protobuf-java-3.6.1.jar
**, 这个就是我们需要的。
4. 源码打成jar包的结果,如图:
四、使用
将生成好的.java文件放入工程,将jar包文件导入工程,即可使用。
扩展资料:
Protobuf3教程 https://blog.csdn.net/hulinku/article/details/80827018#Maps
Protobuf语法指南 https://colobu.com/2015/01/07/Protobuf-language-guide/
gRPC proto3语法指南 https://blog.csdn.net/lyjshen/article/details/52298003
资源下载地址 https://github.com/protocolbuffers/protobuf/releases/tag/v3.6.1
protocol buffers官网 https://developers.google.com/protocol-buffers/