How to dump struct type data using protocol buffer?(如何使用协议缓冲区转储结构类型的数据?)
问题描述
我正在使用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;
这篇关于如何使用协议缓冲区转储结构类型的数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何使用协议缓冲区转储结构类型的数据?
基础教程推荐
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- C++,'if' 表达式中的变量声明 2021-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04