.proto文件的字段可以从零开始吗?

时间:2014-11-11 14:14:37

标签: protocol-buffers

.proto示例似乎都开始将其字段编号为一个。

e.g。 https://developers.google.com/protocol-buffers/docs/proto#simple

message SearchRequest {
  required string query = 1;
  optional int32 page_number = 2;
  optional int32 result_per_page = 3;
}

如果可以使用零,则会使一些消息变小一个或多个字节(即一个或多个字段数为16的字节)。

由于密钥只是(fieldnum<< 3 | fieldtype)的varint编码,我无法立即知道为什么不应该使用零。

是否有理由不将字段编号设为零?

2 个答案:

答案 0 :(得分:5)

一个非常直接的原因是protoc拒绝零字段编号:

test.proto:2:28: Field numbers must be positive integers.

至于为什么Protocol Buffers是这样设计的,我只能猜测。这样做的一个好结果是,充满零的消息将被检测为无效。它还可以用于在内部指示“无字段”作为协议缓冲区实现中的返回值。

答案 1 :(得分:1)

  

分配标签

     

如您所见,消息定义中的每个字段都有唯一的编号标记。这些标记用于以消息二进制格式标识字段,并且在使用消息类型后不应更改。请注意,值为1到15的标记需要一个字节进行编码,包括标识号和字段的类型(您可以在协议缓冲区编码中找到更多相关信息)。 16到2047范围内的标记占用两个字节。因此,您应该为非常频繁出现的消息元素保留标记1到15。请记住为将来可能添加的频繁元素留出一些空间。

     

您可以指定的最小标记号为1,最大值为2 29 -1或536,870,911。您也不能使用数字19000到19999(FieldDescriptor :: kFirstReservedNumber到FieldDescriptor :: kLastReservedNumber),因为它们是为协议缓冲区实现保留的 - 如果您在.proto中使用这些保留数字之一,协议缓冲编译器会抱怨。同样,您不能使用任何以前保留的标签。

https://developers.google.com/protocol-buffers/docs/proto

就像文件所说,0无法被检测到。