如何使用协议缓冲区转储结构类型的数据?
我正在使用
gRPC
,我要使用protocol buffer
将struct type object
从server
传输到client
。我希望将结构数据类型直接转储到消息字段中。
此处给出了我的一些示例代码
server.cpp
我从函数获取struct
类型的对象。
// sample struct
struct Dummy_Info{
int age;
bool presence;
};
// sample function to return struct
Dummy_Info Pass_Dummy_Info()
{
Dummy_Info obj;
obj.age = 54;
obj.presence = 1;
return obj;
}
sample.proto
我想制作的文件(我在这里只使用将用于服务器目的的消息)
syntax = "proto3";
package abc_xyz;
// Response message from server to client
message Server_Response {
float val = 1;
// The following is my desire
struct variable_for_struct_object = 2;
}
// Request message from client to server
message Client_Request {
string name = 1;
}
service Service {
rpc GetAddress(Client_Request) returns (Server_Response) {}
}
server.cpp
// omitted the unnecessary part intentionally. Suppose I have passed the Server_Response as pointer type object and it is `response`
Dummy_Info result;
result = Pass_Dummy_Info();
// The following works flawlessly
response -> set_val(0.5);
// The following I want to prepare
response -> set_variable_for_struct_object(result);
client.cpp
// Here I need to fetch the struct type data
auto data = response_.variable_for_struct_object();
cout << data.presence << endl;
cout << data.age << endl;
我不知道这种直接转储是可能的还是不可能的,或者我可能错过了概念。
我现在正在做的事情:
sample.proto
syntax = "proto3";
package abc_xyz;
// The following I have added which mimics my struct type object
message DATA_TYPE{
int32 age = 1;
bool presence = 2;
}
// Response message from server to client
message Server_Response {
float val = 1;
// The following is my desire
DATA_TYPE variable_for_struct_object = 2;
}
// Request message from client to server
message Client_Request {
string name = 1;
}
service Service {
rpc GetAddress(Client_Request) returns (Server_Response) {}
}
之后,我将CPP文件的格式设置为如下所示,这是可行的
server.cpp
Dummy_Info result;
result = Pass_Dummy_Info();
response->mutable_variable_for_struct_object()->set_age(result.age);
client.cpp
和以前一样。
我希望的原因是避免两次声明相同的结构(在cpp
中声明一次,在proto message format
中声明一次)。如果这里有任何解决办法,希望得到指导。
解决方案
Protobuf为结构保存类似的数据。有关PB与结构的更多信息,请访问:https://developers.google.com/protocol-buffers/docs/cpptutorial
syntax = "proto3";
package communication;
message YourData {
int32 d1 = 1;
string d2 = 2;
}
// Response message from server to client
message Response {
int32 result = 1;
// struct obj_data = 2; // I know this will not work and which pushes me to ask the question.
YourData data = 2;
}
// Request message from client to server
message Request {
string name = 1
}
service Dummy_Service {
rpc GetAddress(Request) returns (Response) {}
}
服务器相关代码
YourData d;
d.set_d1(1);
d.set_d2("hello");
response->mutable_data()->CopyFrom(d)
与客户端相关的代码
auto data = response_.data();
cout << data.d1() << ":" << data.d2() << endl;
相关文章