从protobuf中删除一个字段。

7

我有一个protobuf消息,内容如下:

message MyMessage{
    string foo = 1;
    int toBeRemovedBar = 2 [deprecated = true];
    string zag = 3;
}
toBeRemovedBar 属性不再需要,需要将其删除。 根据这里这里的指南,我可以预留字段名称或编号。 在这里,最佳实践是什么?
  • 预留字段编号或名称
  • 同时预留字段编号和名称
预留字段编号只会防止重用该字段编号,而无法防止重用字段名称。同样的道理也适用于仅预留字段名称。
因此,正确的方法是按照如下方式同时预留字段名称和编号来删除属性:
message MyMessage{
    string foo = 1;

    reserved 2;
    reserved "toBeRemovedBar";

    string zag = 3;
}

1
你是否曾经使用过JSON传输?(gRPC通常使用二进制传输);如果你没有在任何地方使用JSON,那么名称就不那么有趣了。 - Marc Gravell
@marcGravell 我们正在使用默认的protobuf编码,没有计划使用JSON。但是,以下是我考虑的情况:
  1. _tobeRemovedBar_未被保留,下一个版本中可能会有相同命名的字段。
  2. 仍然存在旧的消费者将_ toBeRemovedBar_解释为字段号2。
  3. 新的'toBeRemovedBar'(例如在字段4处)会引起问题吗?消费者假定它是字段号2的属性,但实际上不是。
- Sarvesh
决定同时保留字段编号和名称,以避免未来的兼容性问题。 - Sarvesh
2个回答

8
你应该保留字段编号。这可以防止使用相同标签添加新字段,这会导致在运行具有遗留字段编译的旧版本用户中出现线路不兼容性。从电线兼容性的角度来看,重新使用名称是可以接受的,尽管这样做可能会引起一些混淆。

2

我觉得这很不错。

通过这种方式,你可以防止字段编号和名称在未来被再次使用。在我的一个工作项目中,我也做了同样的事情,因为我必须确保这两个信息不会再次被使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接