Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Protocol buffers 向protobuf v2添加带有必填字段的新消息_Protocol Buffers_Proto - Fatal编程技术网

Protocol buffers 向protobuf v2添加带有必填字段的新消息

Protocol buffers 向protobuf v2添加带有必填字段的新消息,protocol-buffers,proto,Protocol Buffers,Proto,比如说,我有两个版本的proto文件: 版本1.0-初始版本 版本2.0-添加带有必填字段的新邮件 从兼容性的角度来看,这是对proto文件的有效更改吗 既然v2.0定义了一个带有必填字段的新消息,那么它应该会导致向后兼容,因为如果消息从v2.0发送到v1.0,v1.0将无法理解它,它将不知道如何解码它。而且由于它被标记为必需,v1.0甚至不能忽略它。协议缓冲区不处理消息类型的识别。这一部分是在应用程序代码中完成的 因此,这个问题的答案取决于应用程序在接收未知消息时的行为。它可能会忽略它或引发错

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

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

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


既然
v2.0
定义了一个带有必填字段的新消息,那么它应该会导致向后兼容,因为如果消息从
v2.0
发送到
v1.0
v1.0
将无法理解它,它将不知道如何解码它。而且由于它被标记为
必需
v1.0
甚至不能忽略它。

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


因此,这个问题的答案取决于应用程序在接收未知消息时的行为。它可能会忽略它或引发错误-您必须检查代码才能知道。

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


因此,这个问题的答案取决于应用程序在接收未知消息时的行为。它可能会忽略它或引发错误-您必须检查代码才能知道。

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

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

message Old {
  required int32 i = 1;
}
然后我们添加一条新消息:

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

message New {
  required string s = 1;
}
这是向后兼容的。当旧程序向新程序发送消息时,
m
字段将不存在,这是可以的,因为它是可选的。只有当
m
本身存在时,才需要必填字段
m.s

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

请注意,我强烈建议不要使用
required
。Proto3删除了所需的
,而Cap'n Proto从一开始就没有使用过它,因为它可能导致意外的问题


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

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

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

message Old {
  required int32 i = 1;
}
然后我们添加一条新消息:

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

message New {
  required string s = 1;
}
这是向后兼容的。当旧程序向新程序发送消息时,
m
字段将不存在,这是可以的,因为它是可选的。只有当
m
本身存在时,才需要必填字段
m.s

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

请注意,我强烈建议不要使用
required
。Proto3删除了所需的
,而Cap'n Proto从一开始就没有使用过它,因为它可能导致意外的问题

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