检测客户端/服务器版本不匹配的常用方法是什么?

时间:2017-09-13 13:36:43

标签: c# client-server protocol-buffers grpc

我们正在实施客户端/服务器应用程序以在远程系统上运行我们的硬件。

为此,我们使用GRPC,protobuf v3。

当我们修改.proto文件并重新编译客户端而不更新服务器时,我们得到一个带有一条模糊消息的异常:

  

处理程序抛出了异常。

使用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

1 个答案:

答案 0 :(得分:1)

使用protobuf时,建议阅读Language Guide

https://developers.google.com/protocol-buffers/docs/proto3#updating与您的方案特别相关:

  

只要不再使用标签号,就可以删除字段   您更新的消息类型。您可能希望重命名该字段,   也许添加前缀“OBSOLETE_”,或者保留标签   您.proto的未来用户不会意外地重复使用该号码。

这就是你做错了。而不是改变:

~/Google Drive/webpage$ gsutil rsync -d . gs://www.kurtpeek.com
Building synchronization state...
Starting synchronization
Copying file://./.DS_Store [Content-Type=application/octet-stream]...
Copying mtime from src to dst for gs://www.kurtpeek.com/CV_Kurt_Peek_September_2017.pdf
Copying mtime from src to dst for gs://www.kurtpeek.com/confirmation.html
Copying file://./index.html [Content-Type=text/html]...
| [2 files][ 19.1 KiB/ 19.1 KiB]                                                
Operation completed over 2 objects/19.1 KiB. 

为:

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;
}

然后您的客户端和服务器将能够相互通信,无论他们是否具有旧的protobuf定义或新的定义。