从 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 的回答中提到的安全问题。您应该关心的唯一安全是将该字段标记为保留。这将确保以后不会有人不小心使用相同的字段编号
我收到一条 protobuf 消息 -
message Sample{
string field1 = 1;
string field2 = 2;
string field3 = 3;
}
这些消息以二进制格式存储在数据存储中。 因此,如果我想删除上述消息中的任何已定义字段,是否会导致从数据存储区反序列化消息时出现任何问题?
没有。删除字段没问题,尽管您可能希望将其标记为保留,以便没有人以不兼容的方式重用它。带有旧数据(带有字段)的新代码将默默地忽略它;带有新数据的旧代码将在不填充字段的情况下加载,因为 proto3
中的所有内容都隐含地 optional
。这在 proto2
中更成问题,当时 required
是个问题。另一种选择是离开该字段,但用 [deprecated = true]
标记它 - 它仍然存在并被填充,但一些工具会用特定于平台的过时标记标记该成员 language/framework.
添加和删除字段不会引起 Marc 的回答中提到的安全问题。您应该关心的唯一安全是将该字段标记为保留。这将确保以后不会有人不小心使用相同的字段编号