0%

protobuf

Google Protobuf 是语言无关, 平台无关, 可扩展的序列化结构数据的方法, 它可用于 (数据) 通信协议, 数据存储等.
可高效, 自动序列结构数据, 相比与 XML, JSON, 消息更小, 传输更快.
支持 Java, C#, C++, Go 和 Python.

通过 .proto 文件定义数据结构, 之后通过 protoc 工具编译生成多语言版本的源码.
可以更新数据结构, 而不破坏由旧数据结构编译的已部署程序.

1. 使用

  1. https://github.com/protocolbuffers/protobuf/releases 下载编译器
1
2
3
4
5
6
7
8
9
10
axel -n 10 -a https://github.com/protocolbuffers/protobuf/releases/download/v3.13.0/protobuf-all-3.13.0.tar.gz

tar -axf protobuf-all-3.13.0.tar.gz

cd protobuf-all-3.13.0
./configure --prefix=/usr/local/protobuf

make
make check
make install

然后设置环境参数

1
export LD_LIBRARY_PATH=/usr/local/lib
  1. .proto 文件

大致格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
message Type {
[字段规则] 字段类型 字段名称 = 字段序号;
}

字段规则:
required: 字段只能也必须出现 1 次
optional: 字段可出现 0 次或1次
repeated: 字段可出现任意多次(包括 0)
类型: int32、int64、sint32、sint64、string、32-bit ....
字段编号: 不可变且唯一, 0 ~ 536870911(除去 19000 到 19999 之间的数字)

样例:

```proto
syntax = "proto3";

// 指定 package
option java_package = "com.raven.play.protobuf.message";

message Person {
int32 id = 1;
string name = 2;

repeated Phone phone = 4;

enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}

message Phone {
string number = 1;
PhoneType type = 2;
}
}
  1. 编译
1
2
3
4
5
6
# protoc --java_out=../java ./message.proto
protoc --java_out=$target_path --java_package=$target_package $proto_file

# -I 指定文件夹, 可以指定多个
# protoc -I. --java_out=../java *.proto
protoc -I=$source_paths --java_out=$target_path --java_package=$target_package *.proto

package 路径是配置在 .proto 文件里的

  1. 使用

Maven 依赖:

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.13.0</version>
</dependency>
<!-- protobuf & json converter -->
<dependency>
<groupId>com.googlecode.protobuf-java-format</groupId>
<artifactId>protobuf-java-format</artifactId>
<version>1.4</version>
</dependency>

2. Resource