我们正在实现一个客户端/服务器应用程序来在远程系统上运行我们的硬件。
为此,我们使用 GRPC、protobuf v3。
当我们修改 .proto
文件并重新编译客户端而不更新服务器时,我们收到一个异常,并显示一条模糊的消息:
Exception was thrown by handler.
使用 GRPC,检测客户端/服务器版本不匹配的常用方法是什么?
编辑:修改示例
例如,我们更改此(消息参数的特定类型):
service RpcAcquisitionCard {
...
rpc SetNumericalControlOscillator(RpcNcoConfiguration)
...
}
message RpcNco {
RpcDeviceIdentifier deviceId = 1;
core.protobuf.RpcFrequency nco1 = 2;
core.protobuf.RpcFrequency nco2 = 3;
}
到此(消息参数的通用类型)
service RpcAcquisitionCard {
...
rpc SetNumericalControlOscillator(RpcCommandParameter)
...
}
message RpcCommandParameter {
RpcDeviceIdentifier deviceId = 1;
google.protobuf.Any parameter = 2;
}
message RpcNco {
core.protobuf.RpcFrequency nco1 = 1;
core.protobuf.RpcFrequency nco2 = 2;
}
其中 RpcCommandParameter.parameter
字段是 RpcNco
。
最佳答案
使用protobuf时,建议阅读Language Guide .
https://developers.google.com/protocol-buffers/docs/proto3#updating与您的场景特别相关:
Fields can be removed, as long as the tag number is not used again in your updated message type. You may want to rename the field instead, perhaps adding the prefix "OBSOLETE_", or make the tag reserved, so that future users of your .proto can't accidentally reuse the number.
这就是你做错的地方。而不是改变:
message RpcNco {
RpcDeviceIdentifier deviceId = 1;
core.protobuf.RpcFrequency nco1 = 2;
core.protobuf.RpcFrequency nco2 = 3;
}
至:
message RpcNco {
core.protobuf.RpcFrequency nco1 = 1;
core.protobuf.RpcFrequency nco2 = 2;
}
您应该将其更改为:
message RpcNco {
RpcDeviceIdentifier OBSOLETE_deviceId = 1;
core.protobuf.RpcFrequency nco1 = 2;
core.protobuf.RpcFrequency nco2 = 3;
}
然后您的客户端和服务器将能够相互通信,无论它们是旧的还是新的 protobuf 定义。
关于c# - 检测客户端/服务器版本不匹配的常用方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46199085/