在protobuf中重命名枚举值 - 向后兼容性

时间:2018-06-14 12:48:22

标签: java protocol-buffers

我有一个protobuf:

enum Type {
        UNDEFINED = 0;
        SMALL = 1;
        MEDIUM = 2;
        BIG = 3;
}

最后一个值被改变了(不是我):

enum Type {
        UNDEFINED = 0;
        SMALL = 1;
        MEDIUM = 2;
        VERY_BIG = 3;
}

这种变化会对我解析protobuf消息(包含BIG的消息)的能力产生什么影响?在解析二进制编码或文本编码消息之间有区别吗?

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

1 个答案:

答案 0 :(得分:4)

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

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

如果您使用的是JSON格式:您需要对其进行测试。我对JSON规则一无所知(我试图避免JSON输出)。

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

由于EnumValueOptions有一个deprecated标记,您应该可以使用[deprecated=true]对旧标记来标记它已过时。