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

protobuf字段名更改的向后兼容性

管炳
2023-03-14

如果proto的枚举名发生更改,它是否向后兼容?

例如,我最初有这个:

enum ids {
  ID_1 = 1;
  ID_2 = 2; 
};


message {
  ids id = 1
};

我修改枚举定义为:

enum ids {
  ID_3 = 1;
  ID_2 = 2;
};

ID_1的旧proto消息是否与从包含ID_3的消息编译的新解析器兼容?

共有1个答案

宇文兴言
2023-03-14

既然你提到使用proto3,我首先有几个观察。

根据proto3文档,定义枚举时,应始终将零值声明为枚举值列表中的第一个条目。这允许protobuf使用0作为数字默认值,并与proto2语义兼容,其中第一个枚举值始终是默认值。

比如:

enum ids {
  UNKNOWN = 0;
  ID_1 = 1;
  ID_2 = 2; 
};

对于您最初的问题,是否向后兼容替换现有枚举值上的标签,答案是“是”和“否”。

就在线行为而言,它是向下兼容的。假设一个服务有ID_1=1的旧版本,客户端有ID_3=1的新版本。如果服务器在其端设置ID_1,这将转换为通过网络发送的值为1,并将被解释为客户端的ID_3。

它不是向下兼容的,因为当您修改后的proto编译成您使用的任何语言来处理它时,如果有现有的代码正在使用旧版本的proto,则会有编译时中断,因为标签将从ID_1更改为ID_3。

希望这有帮助。

 类似资料:
  • 查看v3规范,新消息似乎是有效的,难道旧的提供程序库(v3.2.13)不支持它吗?我查看了代码,发现了这个commit,在我看来,这似乎是引入更改的地方。 从我的测试来看,新的提供程序库(3.5.12)可以处理新旧格式,但如果类路径中同时存在新的提供程序库和旧的使用者库,http契约测试将失败,并出现运行时错误。 问题:

  • ngrok承诺有关其接口的兼容性和稳定性,以便您可以自信地构建集成顶部,知道在升级到较新版本时期望的更改。 兼容性承诺 Point Release (2.0.0 -> 2.0.1) - ngrok承诺在点发布之间没有突破性的变化 Minor Version Change (2.0 -> 2.1) - ngrok可能会进行小的更改,打破兼容性的次要版本更改。 ngrok承诺,任何破坏性更改将由一个版

  • 确保您可以轻松顺利地升级您的应用程序,这对我们是很重要的。这就是为什么我们只在主 要版本里程碑才会打破兼容性。你可能熟悉 语义版本控制 ,这 就是我们在所有的 CakePHP 项目中使用的通用准则。总之,语义版本控制意味着只有主要版 本(比如2.0,3.0,4.0)可以打破向后兼容性。次要版本(比如2.1,3.1,3.2)可能会引入新 的功能,但不能破坏兼容性。错误修复版本(比如2.1.2,3.0

  • 4.4.12 该版本支持了Websocket帧压缩,修改了push方法的第三个参数为flags,如未设置strict_types,代码兼容性不受影响,否则会出现bool无法隐式转换为int的类型错误,此问题将在v4.4.13修复 4.4.1 注册的信号不再作为维持事件循环的条件,如程序只注册了信号而未进行其他工作将被视为空闲并随即退出 (此时可通过注册一个定时器防止进程退出) 4.4.0 和PHP

  • 我正在尝试用Angular构建一个简单的计算器,如果我想的话,我可以覆盖总数。我有这部分的工作,但当我回去输入一个数字在一个或两个领域的总数没有在该领域的更新。 这是我的jsfiddlehttp://jsfiddle.net/YUza7/2/ 形式 javascript

  • 我正在我的项目中尝试Java8,我被困在与我的构建过程相关的错误中。 我正在使用ANT脚本,在某个时刻,我正在使用一些javascript(嵌入到ANT中)来执行一些特定于构建的操作。导致错误的脚本部分如下所示: 该项目使用Java 7或Java 6构建得很好,但在使用Java 8时,它会给我带来一些错误。这些错误与JS引擎的升级有关。 特别是我得到了以下例外: javax。剧本ScriptExc