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

Rah*_*hak 13 serialization protocol-buffers binary-serialization deserialization protobuf-java

我收到一条 protobuf 消息 -

message Sample{
    string field1 = 1;
    string field2 = 2;
    string field3 = 3;
}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ell 21

不。删除字段很好,尽管您可能希望将其标记为保留,以便没有人以不兼容的方式重用它。带有旧数据(带有字段)的新代码将默默地忽略它;带有新数据的旧代码将仅加载而不填充字段,因为其中的所有内容proto3都是隐式的optionalproto2这在什么时候更成为一个问题required。另一种选择是离开该字段,但将其标记为[deprecated = true]- 它将仍然存在并填充,但某些工具会使用该语言/框架的特定于平台的过时标记来标记该成员。