0

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

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

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

恕我直言,因为v2.0定义了一条带有必填字段的新消息,它应该会导致向后不兼容,因为如果一条消息是从v2.0to发送的v1.0v1.0它不会理解它,它不知道如何解码它。而且既然被标记了requiredv1.0就不能忽视它。

4

2 回答 2

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其本身存在时才是必需的。

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

请注意,我强烈建议不要使用required. Proto3 被移除required,而 Cap'n Proto 一开始就没有它,因为它可能会导致意想不到的问题。这是我写的深入讨论。

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

于 2016-07-06T20:18:39.640 回答
0

Protocol Buffers 不处理消息类型的识别。那部分是在应用程序代码中完成的。

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

于 2016-07-06T07:30:04.030 回答