Protocol buffers protobuf在更改字段名时的向后兼容性
如果更改了proto的枚举名称,它是否向后兼容 e、 g我最初有: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以来,我首先有几个观察结果 根据,定义枚举时,应始终将零值声明为枚举值列表中的第一个条目。这允
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