【发布时间】:2021-01-22 15:34:12
【问题描述】:
我有这样的 protobuf 消息:
message MyMessage{
string foo = 1;
int toBeRemovedBar = 2 [deprecated = true];
string zag = 3;
}
toBeRemovedBar 属性不再需要,需要删除。 根据here 和here 的指导方针,我可以保留 字段名称或编号。 这里的最佳做法是什么?
- 保留字段编号或名称
- 保留字段编号和名称
保留字段编号只会阻止字段编号的重复使用。无法阻止重复使用字段名称。类似的论点适用于仅保留字段名称。
那么,删除属性的正确方法是保留字段名称和编号,如下所示?
message MyMessage{
string foo = 1;
reserved 2;
reserved "toBeRemovedBar";
string zag = 3;
}
【问题讨论】:
-
您是否曾经使用过 JSON 传输? (gRPC 通常使用二进制传输);如果您不在任何地方使用 JSON,那么名称就没那么有趣了
-
@marcGravell 我们正在使用默认的 protobuf 编码,并且没有使用 JSON 的计划。但是,以下是我想到的场景: 1. tobeRemovedBar 没有保留,并且在下一个版本中某些字段的名称相同。 2. 仍然有老消费者在第 2 字段解释 toBeRemovedBar。 3. 新的“toBeRemovedBar”(比如在第 4 字段)会导致问题吗?消费者假设它是第 2 字段的属性,但事实并非如此。
-
决定保留字段编号和名称,以避免将来出现兼容性问题
标签: protocol-buffers grpc proto