首页 > 解决方案 > protobuf 对字段名称更改的向后兼容性

问题描述

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

例如,我最初有这个:

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


message {
  ids id = 1
};

我将枚举定义修改为:

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

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

标签: protocol-buffers

解决方案


既然你提到使用 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。

从某种意义上说,它不是向后兼容的,当您修改后的原型被编译成您用来处理它的任何语言时,如果存在使用旧版本原型的现有代码,则会出现编译时中断,因为标签将从 ID_1 更改为 ID_3。

希望这可以帮助。


推荐阅读