从 protobuf 消息中删除现有字段会导致问题吗?

Does removing existing field from protobuf message cause issues?

我收到一条 protobuf 消息 -

message Sample{
    string field1 = 1;
    string field2 = 2;
    string field3 = 3;
}

这些消息以二进制格式存储在数据存储中。 因此,如果我想删除上述消息中的任何已定义字段,是否会导致从数据存储区反序列化消息时出现任何问题?

没有。删除字段没问题,尽管您可能希望将其标记为保留,以便没有人以不兼容的方式重用它。带有旧数据(带有字段)的新代码将默默地忽略它;带有新数据的旧代码将在不填充字段的情况下加载,因为 proto3 中的所有内容都隐含地 optional。这在 proto2 中更成问题,当时 required 是个问题。另一种选择是离开该字段,但用 [deprecated = true] 标记它 - 它仍然存在并被填充,但一些工具会用特定于平台的过时标记标记该成员 language/framework.

添加和删除字段不会引起 Marc 的回答中提到的安全问题。您应该关心的唯一安全是将该字段标记为保留。这将确保以后不会有人不小心使用相同的字段编号