【问题标题】:Removing a field in protobuf删除 protobuf 中的字段
【发布时间】:2021-01-22 15:34:12
【问题描述】:

我有这样的 protobuf 消息:

message MyMessage{
    string foo = 1;
    int toBeRemovedBar = 2 [deprecated = true];
    string zag = 3;
}

toBeRemovedBar 属性不再需要,需要删除。 根据herehere 的指导方针,我可以保留 字段名称或编号。 这里的最佳做法是什么?

  • 保留字段编号或名称
  • 保留字段编号和名称

保留字段编号只会阻止字段编号的重复使用。无法阻止重复使用字段名称。类似的论点适用于仅保留字段名称。

那么,删除属性的正确方法是保留字段名称和编号,如下所示?

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


【解决方案1】:

您应该保留字段编号。这将防止使用相同的标签添加新字段,这将导致运行旧版本且已编译遗留字段的任何用户的线路不兼容。从线路兼容性的角度来看,重用名称是好的,尽管这样做可能会引起一些混乱。

【讨论】:

    【解决方案2】:

    我觉得不错。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多