Renaming enum value in protobuf - backward compatibility

Vit*_*mud 5 java protocol-buffers

I have a protobuf:

enum Type {
        UNDEFINED = 0;
        SMALL = 1;
        MEDIUM = 2;
        BIG = 3;
}
Run Code Online (Sandbox Code Playgroud)

The last value was changed (not by me):

enum Type {
        UNDEFINED = 0;
        SMALL = 1;
        MEDIUM = 2;
        VERY_BIG = 3;
}
Run Code Online (Sandbox Code Playgroud)

这种变化对我解析 protobuf 消息(包含 BIG 的消息)的能力有什么影响?解析二进制编码或文本编码的消息是否有所不同?

弃用 BIG 并引入 VERY_BIG 值的最佳做法是什么?

Mar*_*ell 8

如果您使用的是二进制 protobuf 格式,那么:没问题。仅发送原始值 - 作为 varint,而不是作为名称。曾经映射到的数据BIG现在将显示为VERY_BIG. 你将无法区分两者。

更改架构并重新运行 protoc 可能会给您带来一些构建错误,直到您在自己的代码中修复相同的更改,但 protobuf 本身不会在意,甚至不会注意到。

如果您使用的是 JSON 格式:您需要对其进行测试。我对 JSON 规则了解不够(我尽量避免 JSON 输出)。

一般来说,重命名不是一个好的选择。最好添加具有新唯一值的新条目并将旧条目标记为已弃用,但请注意,您可能仍然期望旧值。

由于EnumValueOptions有一个deprecated标志,您应该能够使用[deprecated=true]旧值将其标记为过时。