10

假设我有一个 proto3 消息定义如下,用作 gRPC 请求(即使用 protobuf 的二进制编码):

message MyRequest {
  string name = 1;
}

我可以更改我的服务器(即消息的阅读器)以使用以下定义而不破坏现有客户端(即编写器)的线路兼容性吗?

message MyRequest {
  repeated string names = 1;
}

proto2 语言指南中,我看到以下内容:

optional兼容repeated。给定重复字段的序列化数据作为输入,optional如果它是原始类型字段,则期望此字段的客户端将采用最后一个输入值,如果它是消息类型字段,则合并所有输入元素。

但是,proto3 文档不包含等效语句。我认为这可能与packedproto3中重复字段的编码使用有关。

4

1 回答 1

8

是的,这是可能的,因为可选的二进制编码stringrepeated string具有单个元素的 a 的二进制编码是相同的。但是,此更改可能会使代码的读者感到困惑,因为可以通过这种方式重新解释消息并不是很明显。

于 2017-09-07T14:24:40.093 回答