Protocol buffers protobuf在更改字段名时的向后兼容性

Protocol buffers protobuf在更改字段名时的向后兼容性,protocol-buffers,Protocol Buffers,如果更改了proto的枚举名称,它是否向后兼容 e、 g我最初有: 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的消息编译而来的新解析器兼容?自从您提到使用proto3以来,我首先有几个观察结果 根据,定义枚举时,应始终将零值声明为枚举值列表中的第一个条目。这允

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

e、 g我最初有:

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的消息编译而来的新解析器兼容?

自从您提到使用proto3以来,我首先有几个观察结果

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

比如:

enum ids {
  UNKNOWN = 0;
  ID_1 = 1;
  ID_2 = 2; 
};
对于您最初的问题,是否向后兼容替换现有枚举值上的标签,答案是“是”和“否”

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

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


希望这有帮助。

proto2或proto3?我正在使用proto3