我有两个版本的 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
字段之间进行更改并不完全是破坏性的(尤其是在添加repeated
时),但可能会造成混淆。如果您使用 JSON 格式,那么在重命名字段时,您可能需要使用
json_name
架构中的可选标记,以保留JSON 中的旧名称,以免发生数据丢失。