protocol-buffers - protobuf 对字段名称更改的向后兼容性
问题描述
如果更改了 proto 的枚举名称,它是否向后兼容?
例如,我最初有这个:
enum ids {
ID_1 = 1;
ID_2 = 2;
};
message {
ids id = 1
};
我将枚举定义修改为:
enum ids {
ID_3 = 1;
ID_2 = 2;
};
ID_1 的旧原始消息是否与从包含 ID_3 的消息编译的新解析器兼容?
解决方案
既然你提到使用 proto3,我首先有几个观察。
根据proto3 文档,在定义枚举时,您应该始终将零值声明为枚举值列表中的第一个条目。这允许 protobuf 使用 0 作为数字默认值,并与 proto2 语义兼容,其中第一个枚举值始终是默认值。
就像是:
enum ids {
UNKNOWN = 0;
ID_1 = 1;
ID_2 = 2;
};
对于您最初的问题,是否替换现有枚举值向后兼容的标签,答案是肯定的和否定的。
就在线行为而言,它是向后兼容的。假设服务具有 ID_1 = 1 的旧版本原型,而客户端具有 ID_3 = 1 的较新版本原型。如果服务器在其末端设置 ID_1,这将转换为通过线路发送的值 1并将在客户端解释为 ID_3。
从某种意义上说,它不是向后兼容的,当您修改后的原型被编译成您用来处理它的任何语言时,如果存在使用旧版本原型的现有代码,则会出现编译时中断,因为标签将从 ID_1 更改为 ID_3。
希望这可以帮助。
推荐阅读
- javascript - 无法解析数组以在 ejs 节点 js 中查看
- android - 为什么 Android Studio 自动导入 android.app.Fragment 而不是 androidx.fragment.app.Fragment?
- javascript - Vuex:状态更改不更新输入字段
- javascript - 在 javascript 中编码 url 不编码 &
- swift - 无法将“CGPoint”类型的值分配给“CGFloat”类型
- java - 为什么我总是被信号 2 打断:Java 中 for 循环上的 SIGINT
- python - Python — 使用 lambda 排序(健全性检查)
- flutter - Android Studio 中的颤振错误
- ionic-framework - 使用文件传输插件时出错 - Ionic 3
- regex - 使用记事本++和正则表达式从数组中删除两个元素