protobuf 中的一个字段向后兼容性

问题描述 投票:0回答:1

我有两个版本的 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
字段中。新版本与旧版本兼容吗?

protocol-buffers backwards-compatibility
1个回答
0
投票

假设您使用的是二进制格式(而不是固执己见的 JSON 格式),那么:是的,没问题。

  1. 在二进制有效负载格式中,名称不存在 - 只有字段编号,因此:是的,将

    some_boolean_field
    重命名为
    some_boolean_field_in_oneof
    没有什么区别 - 它们都只是格式的字段 1。

  2. oneof
    不存在于二进制有效负载格式中 - 它们只是它恰好发生的字段,最多会出现一个;添加
    oneof
    不会引入额外的结构层,因此添加额外的
    oneof
    字段,或将现有常规字段更改为具有相同编号
    字段的 oneof 字段:也可以。

  3. 二进制格式中

安全的更改包括:更改数据类型、更改字段编号、使用required(在 proto2 中)。在一元和

repeated
字段之间进行更改并不是严格意义上的破坏(特别是在
adding
repeated 时),但可能会导致混乱。
如果您使用 JSON 格式,则在重命名字段时,您可能需要在架构中使用可选的 

json_name

标记,以保留 JSON 中的

old
名称,以免发生数据丢失。

© www.soinside.com 2019 - 2024. All rights reserved.