【问题标题】:Google protobuf 3: deprecated a field, but cannot remove the dependencies?Google protobuf 3:弃用了一个字段,但无法删除依赖项?
【发布时间】:2020-06-02 10:25:55
【问题描述】:

我有一个依赖于 proto B 的 proto A。然后我弃用了 protoB 字段:

import "protoB.proto";

message ProtoA {
  string assignmentStatus = 1;
  protoB proto_b = 2 [deprecated = true];
}

我认为在这种情况下我应该能够删除import 语句,对吗?但是当我这样做时,编译器会抱怨没有导入依赖项。

这是怎么回事?

【问题讨论】:

    标签: protocol-buffers protobuf-net proto


    【解决方案1】:

    将某些东西标记为已弃用只是...将其标记为已弃用;例如,在 C# 中,proto_b 成员将被声明但标记为 [Obsolete]。既然它仍然存在,它需要知道用什么来描述它。例如,数据仍然可以在您的应用程序中访问。

    如果你想移除它:移除它:

    message ProtoA {
      string assignmentStatus = 1;
      // field 2 *was* protoB proto_b = 2, now removed
    }
    

    (留下评论对于避免人们意外重复使用字段编号很重要,这可能会导致现有数据出现问题)。

    【讨论】:

    • 删除该字段后,您应该将其标记为reserved。这是为了保持向后兼容性,同时防止使用相同的字段 id 进行新添加。更多信息here.
    • 谢谢!不知道我们可以删除字段,我认为需要索引号来保持兼容性。
    • @heythere 不;只是不要重复使用来表示别的意思,这是重点;您也不应该添加或删除“必填”字段,但 proto3 没有“必填”的概念
    猜你喜欢
    • 2020-10-01
    • 2018-05-10
    • 1970-01-01
    • 2020-12-25
    • 2022-10-25
    • 2020-11-09
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多