当前位置: 首页 > 知识库问答 >
问题:

proto3可选字段是否可以更改为“重复”,而不破坏导线兼容性?

乜烨霖
2023-03-14

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

message MyRequest {
  string name = 1;
}

我是否可以更改服务器(即消息的读取器)以使用以下定义,而不破坏现有客户端(即写入程序)的有线兼容性?

message MyRequest {
  repeated string names = 1;
}

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

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

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

共有1个答案

阎声
2023-03-14

是的,这是可能的,因为可选string的二进制编码和具有单个元素的重复字符串的二进制编码是相同的。但是,这种变化可能会让代码的读者感到困惑,因为不明显可以以这种方式重新解释消息。

 类似资料:
  • 我有以下信息: 我希望将权重和override_weight(可选字段)的类型更改为,因此我所做的是流动: 我的问题是,假设我有以前的protobuff消息编译器为旧消息编译的旧消息,我能将它们解析为新消息吗?文件对此非常模糊: “将可选字段移入或移出其中一个:消息序列化和分析后,您可能会丢失一些信息(某些字段将被清除)。但是,您可以安全地将单个字段移入新字段中,并且如果已知只设置了一个字段,则可

  • 问题内容: 是否可以在运行时以某种方式更改枚举本身?例如使用反射。问题不是要更改枚举常量的状态。它即将更改枚举的常量集或删除任何常量。 关于以下枚举,是否可以添加颜色或删除颜色或更改其顺序? 我为什么要问? 首先,我想知道这是否可行。 但是如果是这样,是否会对使用Enum实现单例的通用方式产生影响? 我知道这个问题有点恶意。但是,即使是约书亚·布洛赫(Joshua Bloch )在谈论实现单例(1

  • 我想知道OpenCV是否能够将摄像头(dev/video1)设置为复合或S-video输入。 我使用的摄像头仅在复合输入中运行,但默认情况下,v4l2在S-Video输入中打开dev/video1。V4l2能够通过QT V4l2 utils应用程序从S视频转换为复合输入。 opencv正在使用v4l从相机捕获图像,我想在代码中使用OpenCV更改为复合输入。那有可能吗?如果不是,解决办法是什么?

  • 问题内容: 的 多重嵌套视图 功能非常好-您可以轻松地从应用程序的一种 状态 跳到另一种 状态 。 有时您可能想更改URL,但有时不需要。我觉得 状态 的概念应该与 route 分开/可选。 这是一个说明我意思的朋克。 这是文档中的一个小工具的分支,下面有2个小更改: 这似乎可行-URL保持不变。同样,这里做了多少多余的工作?这是经过批准/测试的用法吗? 如果您可以省略某个州的信息,那就太好了。

  • 数据表格的表头菜单字段里,勾选“字段内容不允许重复”后,将会对本图层该属性字段值进行去重比较,如果新填写的内容有和之前填写内容重复的,将不能保存

  • 我从对象和对象数组中更改了一个对象两次,这样在第一次迭代中,我过滤掉了几个对象,在第二次迭代中,我使用map更改了每个过滤后的对象。我能用减速机或更好的吗?