Protocol Buffers 简介
Protocol Buffers 是一种用于序列化结构化数据的二进制格式,由 Google 开发。它具有以下优点:
- 体积小、快速、高效
- 可以跨平台、跨语言使用
- 提供简单的语法来定义数据结构
- 自动生成代码以便于在各种编程语言中处理数据
proto2 和 proto3
Protocol Buffers 主要有两个版本:proto2 和 proto3。这两个版本在字段规则方面有所不同。
proto2
在 proto2 中,字段可以使用以下三种规则之一:
required
:表示字段在消息中必须存在。optional
:表示字段在消息中可以存在,也可以不存在。repeated
:表示字段在消息中可以包含多个值(类似于数组)。
proto3
在 proto3 中,所有字段都默认为 optional
。因此,可以存在,也可以不存在。proto3 不再支持 required
关键字。repeated
规则仍然存在,用于表示多值字段。
map 字段
map
字段是一种特殊的字段类型,用于表示键值对的集合。map
字段的定义语法如下:
map<key_type, value_type> field_name = field_number;
其中,key_type
可以是任何整数或字符串类型,value_type
可以是任何有效的 protobuf 类型。
示例:
message MyMessage {
map<string, int32> my_map = 1;
}
在这个例子中,my_map
是一个键为字符串、值为 32 位整数的 map 字段。
map 字段与 optional 和 required
在定义 protobuf 的 map
字段时,不需要(也不能)添加 optional
或 required
关键字。这是因为 map
字段本质上是一个特殊类型的 repeated
字段,表示一个键值对列表。repeated
字段表示可以包含多个条目,也可以没有任何条目,因此其实质上已经是可选的。
在 proto2 中,map
字段没有 optional
和 required
的概念。在 proto3 中,由于所有字段默认为 optional
,map
字段也默认为可选。
下面的定义是正确的:
message Test {
map<string, int32> field1 = 1;
}
而下面的定义是错误的,会导致语法错误:
message Test {
optional map<string, int32> field1 = 1; // 错误:不能将optional用于map字段
}