我可以将消息字段从枚举更新为字符串,并保留其名称吗?

Can I update a message field from enum to string, and keep its name?

代码

考虑以下 protobuf 消息声明:

syntax = "proto3";

enum Airport {
    TLV = 0;
    JFK = 1;
    ...
}

message Flight {
    ...
    Airport origin_airport = 11;
    ...
}

问题

由于一些业务需求,我们必须将Airport设置为一个自由字符串,而不是从一个封闭的枚举列表中选择。我知道我可以随意添加和删除字段,只要我不重复使用相同的数字即可。但是,我不确定我是否可以使用相同的名称,a-la:

message Flight {
    ...
    reserved 11;                    // The old enum field number
    string origin_airport = 18;     // Unused so far
    ...
}

我的问题

更新protobuf3字段类型后,字段名是否可以保留,只要其编号发生变化?

如果您没有使用 JSON 变体,那么有效负载中根本不会使用名称,所以是的 技术上 重复使用是完全合法的姓名;然而:这可能会导致现有代码出现不必要的问题——取决于现有代码和语言/框架的特定规则,并可能导致混淆。由于这是可以避免的,我建议使用 origin_airport_code 或类似的名称。

(我在这里提出的观点:任何使用旧字段的代码都可能需要注意;我可以看到一些场景,现有代码在更改后可能仍然编译 ,但意思不同,因此引入了一个错误,如果您更改名称并强制访问每个用法,则可以避免该错误)