向protobuf v2添加包含必填字段的新消息

时间:2016-07-05 23:19:31

标签: protocol-buffers proto

说,我有两个版本的proto文件:

  

1.0版 - 初始版本
  版本2.0 - 添加带有必填字段的新邮件

从兼容性的角度来看,这是proto文件中的有效更改吗?

恕我直言,因为v2.0定义了包含必填字段的新邮件,因此如果邮件从v2.0发送到v1.0,则会导致向后兼容,v1.0不明白,它不知道如何解码它。由于它标记为requiredv1.0甚至无法忽略它。

2 个答案:

答案 0 :(得分:4)

现有消息类型添加新的必填字段是向后不兼容的更改,因为旧服务器不会发送该字段。

添加具有必填字段的全新消息类型是向后兼容的,因为旧服务器根本不会发送该消息。例如,假设我们从:

开始
message Old {
  required int32 i = 1;
}

然后我们添加一条新消息:

message Old {
  required int32 i = 1;
  optional New m = 2;
}

message New {
  required string s = 1;
}

这是向后兼容的。当旧程序向新程序发送消息时,字段m将不存在,这很好,因为它是可选的。仅当m.s本身存在时才需要字段m

当新程序向旧程序发送消息时,将忽略字段mrequired并不意味着接收者不能忽视它。 required仅表示发件人需要发送。

请注意,我强烈建议不要使用required。 Proto3删除了required,而Cap'n Proto从未首先使用它,因为它可能导致意外问题。 Here's an in-depth discussion I wrote.

(披露:我是Proto2和Cap'n Proto的作者。)

答案 1 :(得分:0)

协议缓冲区不处理对消息类型的识别。那部分是在应用程序代码中完成的。

所以这个问题的答案取决于应用程序收到未知消息时的作用。它可能会忽略它或引发错误 - 您必须检查代码才能知道。