如果原型的枚举名称更改了,它是否向后兼容?
例如,我最初有这个:
enum ids {
ID_1 = 1;
ID_2 = 2;
};
message {
ids id = 1
};
然后将枚举定义修改为:
enum ids {
ID_3 = 1;
ID_2 = 2;
};
ID_1的旧原始消息是否与包含ID_3的消息中编译的新解析器兼容?
答案 0 :(得分:1)
自从您提到使用proto3以来,我首先有一些观察。
根据proto3 docs,定义枚举时,应始终将零值声明为枚举值列表中的第一项。这样,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。
希望这会有所帮助。