protobuf向后兼容字段名称更改

时间:2018-08-28 06:12:06

标签: protocol-buffers

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

例如,我最初有这个:

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


message {
  ids id = 1
};

然后将枚举定义修改为:

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

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

1 个答案:

答案 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。

希望这会有所帮助。

相关问题