【发布时间】:2021-11-17 23:44:19
【问题描述】:
我对协议缓冲区还很陌生,但一直在尝试将它们作为通过 MQTT 发送数据的一种方式来学习。到目前为止,我已经很好地创建了 proto 消息并为 python 运行时编译它们,直到我开始注意到我的 protobufs 版本之间的不兼容。
当我向服务器端原型定义添加消息类型(不更改现有消息/字段)而不更新客户端原型定义时,解码发送到服务器的消息会给我带来不确定的结果。
下面是我所说的一个例子:
客户端原型:
message Wrapper {
optional uint32 id = 1;
optional string name = 2;
oneof payload {
Event event = 3;
Command command = 4;
}
}
message Event {
uint32 event_id = 1;
oneof event_payload {
LoginEvent login_event = 2;
LogoffEvent logoff_event = 3;
}
}
服务器原型:
message Wrapper {
optional uint32 id = 1;
optional string name = 2;
oneof payload {
Event event = 3;
Command command = 4;
}
message Event {
uint32 event_id = 1;
oneof event_payload {
LoginEvent login_event = 2;
LogoffEvent logoff_event = 3;
NewUserEvent new_user_event = 4;
}
}
我将编码并从客户端发送一条消息:
message Wrapper {
id = 12345;
name = John;
event = {
login_event = ...
}
}
并将在服务器上解码消息并获取:
message Wrapper {
id = 12345;
name = John;
event = {
logoff_event = ...
}
}
注意:解码后的消息类型不确定,消息之间会发生变化
有人可以解释为什么添加事件类型似乎会破坏解码吗?或者我应该遵循什么最佳实践来提高版本兼容性?提前致谢!
【问题讨论】:
标签: protocol-buffers version grpc decode encode