Post

Protocol Buffer 语法

Protocol Buffer语法

好的,下面我将更详细地说明 Protobuf 的语法。

  1. Protobuf 版本

Protobuf 定义了两个版本:proto2 和 proto3。其中,proto2 是旧版本,proto3 是新版本。proto3 做了很多改进,比如对标量类型的定义进行了优化,使其更加严格和一致;移除了一些不必要的特性;默认情况下启用了所有字段都是 required 约束(但现在 required 已经被标记为 deprecated)等等。

在 Protobuf 文件开头需要指定使用的版本,例如:

1
syntax = "proto3";

可以通过这个语句来告诉编译器使用 proto3 版本。

  1. 包名

与许多编程语言类似,Protobuf 中也有包名的概念。一个 Protobuf 文件通常属于一个特定的包,并且由该包内的多个消息组成。

使用 package 关键字来指定包名,例如:

1
package example;

这里指定了文件所属的包为 example

  1. 引入其他文件

如果一个 Protobuf 文件依赖于另一个文件中定义的类型,那么可以使用 import 关键字来引入该文件。例如:

1
import "google/protobuf/timestamp.proto";

这里引入了 Google 提供的 Protobuf 文件中的 timestamp.proto 文件,使得我们可以在该文件中使用 Timestamp 类型。

  1. 消息类型

在 Protobuf 中,使用 message 关键字来定义消息类型。一个消息由一个或多个字段组成,每个字段有一个名称和一个类型。

例如:

1
2
3
4
message Person {
  string name = 1;
  int32 age = 2;
}

这里定义了一个名为 Person 的消息类型,它有两个字段:name 和 age。name 的类型是 string,age 的类型是 int32。

  1. 字段

Protobuf 中的字段可以具有以下属性:

  • 名称:用于标识该字段。
  • 类型:定义了该字段所能包含的数据类型。
  • 标识号:用于在二进制编码中标识该字段。
  • 规则:指定该字段是否是必需的,可选的,重复的等。

例如:

1
2
3
4
5
6
message Person {
  string name = 1;
  int32 age = 2;
  repeated string address = 3;
  bool is_student = 4 [default = false];
}

这里定义了四个字段:

  • name:类型为 string,标识号为 1,必需的。
  • age:类型为 int32,标识号为 2,必需的。
  • address:类型为 string 数组,标识号为 3,可重复的。
  • is_student:类型为 bool,标识号为 4,可选的,默认值为 false。
  1. 枚举

除了消息类型之外,Protobuf 还支持枚举类型。通过 enum 关键字定义一个枚举类型,例如:

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

这里定义了一个名为 PhoneType 的枚举类型,它包含三个值:MOBILE、HOME 和 WORK,对应的值分别为 0、1 和 2。

  1. 其他特性

除了上述基本语法之外,Protobuf 还支持许多其他特性,如注释、嵌套类型、扩展等。具体可以参考 Protobuf 官方文档。

This post is licensed under CC BY 4.0 by the author.