Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 系统和持续数据存储系统。
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。
二 Protobuf的语法
使用
- 创建.proto文件:
syntax = "proto3";
package netty;
option java_package = "cn.xpleaf.protobuf";
option java_outer_classname = "SubscribeReqProto";
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
option java_package : 声明包路径
option java_outer_classname : 定义类名,不声明的话它将通过将文件名转换为camel case来生成。例如,默认情况下,“my_proto.proto”将使用“MyProto”作为外部类名。
syntax : 指定语法,指定了语法格式为proto2或proto3,即protobuf 2的语法,默认也是使用proto2的语法。
1 *.proto文件中数据类型可以分为两大类:
复合数据类型 + 标准数据类型
复合数据类型包括:枚举和message类型
标准数据类型包含:
整型 : int32
浮点 : float,double
字符串 : string
布尔: bool
2 数据类型前面修饰词:
required(必选字段): 必须赋值,不能为空,否则该条message会被认为是“uninitialized”。build一个“uninitialized” message会抛出一个RuntimeException异常,解析一条“uninitialized” message会抛出一条IOException异常。除此之外,“required”字段跟“optional”字段并无差别。
optional(可选字段):字段可以赋值,也可以不赋值。假如没有赋值的话,会被赋上默认值。
repeated(可重复字段): 该字段可以重复任意次数,包括0次。重复数据的顺序将会保存在protocol buffer中,将这个字段想象成一个可以自动设置size的数组就可以了。
3.每个字段要给数字:
该Number是用来标记该字段在序列化后的二进制数据中所在的field,每个字段的Number在message内部都是独一无二的。也不能进行改变,否则数据就不能正确的解包。
- 安装protoc(win版)
1.下载protobuf
https://github.com/google/protobuf/releases
选择protoc-xxx-win32.zip下载
2.将解压出来的protoc.exe放在一全英文路径下,并把其路径名放在windows环境变量下的path下,同时添加proto_path,值为protoc.exe的路径
3.在所使用的proto文件路径下打开cmd窗口执行以下命令
protoc -I=源地址 --java_out=目标地址 源地址/xxx.proto
- 编译.protoc文件
在protoc.exe所在目录执行:
.\protoc --java_out=.\ XXX.proto #注意.\与XXX.proto 中间有空格
- 引入依赖:
<!-- protobuf begin -->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.6.1</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
<version>3.6.1</version>
</dependency>
<dependency>
<groupId>com.googlecode.protobuf-java-format</groupId>
<artifactId>protobuf-java-format</artifactId>
<version>1.4</version>
</dependency>
<!-- protobuf end -->
三、为什么不使用XML?
相对于XML,protocol buffers在序列化结构数据时拥有许多先进的特性:
1、更简单
2、序列化后字节占用空间比XML少3-10倍
3、序列化的时间效率比XML快20-100倍
4、具有更少的歧义性
5、自动生成数据访问类方便应用程序的使用