Google protobuf 3:弃用了一个字段,但无法删除依赖项?

Hey*_*ere 14 protocol-buffers protobuf-net proto

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

import "protoB.proto";

message ProtoA {
  string assignmentStatus = 1;
  protoB proto_b = 2 [deprecated = true];
}
Run Code Online (Sandbox Code Playgroud)

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

这是怎么回事?

Mar*_*ell 5

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

如果你想删除它:删除它:

message ProtoA {
  string assignmentStatus = 1;
  // field 2 *was* protoB proto_b = 2, now removed
}
Run Code Online (Sandbox Code Playgroud)

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

  • 删除该字段后,您应该将其标记为“保留”。这是为了保持向后兼容性,同时防止使用相同的字段 ID 添加新内容。更多信息[此处](https://developers.google.com/protocol-buffers/docs/proto3#reserved)。 (25认同)
  • 仅仅删除该字段是一种不好的做法。从明天开始,它会破坏向前兼容性,该组件可能会使用相同的字段索引来获取其他信息。这里最好的方法是将其标记为“保留”。 (3认同)