2

(实际上)是否可以在不中断通信的情况下更改protobuf 消息类型(或枚举)的类型名称?

显然,需要修改使用代码才能重新编译。问题是使用相同结构但旧名称的旧客户端是否会继续工作?

示例,基于真实文件:

test.proto

syntax = "proto3";
package test;
// ...

message TestMsgA {

  message TestMsgB { // should be called TestMsgZZZ going forward
    // ...
    enum TestMsgBEnum { // should be called TestMsgZZZEnum going forward
    // ...
    }

    TestMsgBEnum foo = 1;
    // ...
  }

  repeated TestMsgB bar = 1;
  // ...
}

如果更改类型或枚举名称,protobuf 有效负载的在线格式是否会发生任何变化?

4

1 回答 1

2

如果您在谈论二进制格式,那么不:名称无关紧要,不会影响您加载数据的能力;对于枚举,只有整数值存储在有效负载中。对于字段,仅存储字段编号。

显然,如果您交换两个名称,可能会发生混淆,但是:只要结构匹配,它就应该加载。

如果您谈论的是 JSON 格式,那么它可能很重要。

于 2019-11-11T15:12:10.933 回答