我有两个版本的 protobuf 消息,想看看旧版本(对于不是最新的客户端)是否与新版本兼容。
旧版本:
message Foo {
bool some_boolean_field = 1;
}
新版本:
message Foo {
enum SomeEnum {
A = 0;
B = 1;
C = 2;
}
oneof oneof_field {
bool some_boolean_field_in_oneof = 1;
SomeEnum some_enumeration_field_in_oneof = 2;
}
}
旧版本中有一个名为
some_boolean_field
的字段,我希望将其重命名,并与另一个字段一起位于 oneof
字段中。新版本与旧版本兼容吗?
假设您使用的是二进制格式(而不是固执己见的 JSON 格式),那么:是的,没问题。
在二进制有效负载格式中,名称不存在 - 只有字段编号,因此:是的,将
some_boolean_field
重命名为 some_boolean_field_in_oneof
没有什么区别 - 它们都只是格式的字段 1。
oneof
不存在于二进制有效负载格式中 - 它们只是它恰好发生的字段,最多会出现一个;添加 oneof
不会引入额外的结构层,因此添加额外的 oneof
字段,或将现有常规字段更改为具有相同编号 和新 字段的
oneof
字段:也可以。
安全的更改包括:更改数据类型、更改字段编号、使用required
(在 proto2 中)。在一元和
repeated
字段之间进行更改并不是严格意义上的破坏(特别是在 adding
repeated
时),但可能会导致混乱。如果您使用 JSON 格式,则在重命名字段时,您可能需要在架构中使用可选的 json_name
标记,以保留 JSON 中的
old名称,以免发生数据丢失。