写点什么

C++ 使用 protobuf 嵌套结构体总结

  • 2022-10-14
    河北
  • 本文字数:1745 字

    阅读完需:约 6 分钟

C++使用protobuf嵌套结构体总结

前面的章节讲述了如何将 protobuf 环境配置到 VS+Qt 的环境,那么这一章节就来讲述下,如何使用并解析复杂的嵌套式 protobuf 结构。


今天我们就以组装以及解析两大部分分别说明吧!


今天使用的例子如下:

syntax = "proto3";
package JCProto;
message Test_st1{ string s1 = 1; string s2 = 2; repeated Child_Test1 test1 = 3;}
message Child_Test1{ string s1 = 1; int32 n1 = 2;}
复制代码

当前代码只是例子,名字都是随意定义的,大家在实际项目中千万不要写成这个样子呀!你就准备接收项目经理的批评吧,哈哈!


上述 protobuf 说明:


首先第一句话:syntax = "proto3"; 代表是使用了 protobuf3 结构,这个是一定要需要写清楚的,如果不写的话,你的电脑里存在 protobuf2 和 3 两个版本的时候,最容易混淆了,大家应该懂得版本冲突的问题吧!


该 protobuf 中存在了两个结构:Test_st1、Child_Test1。很明显,Child_Test1 是属于 Test_st1 的子结构,并且是一种类似于 vector 容器的结构体。


如果不是很清楚的,可以理解成 C++版的结构体

vector 类似于 repeated。也相当于数组


一开始很多人不是很理解这个关键词的意思,这么一转换就很清楚看出是什么意思了。


那么,我们来实际的功能操作吧!

功能 1:组装 protobuf 结构体

难点:如何存储数组类的结构体?

普通的 string 以及 int 赋值很好处理,直接使用 goole 内部的函数就可以了,重点就讲解下如何给结构体如何赋值。

声明 protobuf 定义的结构体,Test_st1

JCProto::Test_st1 cmdTest;
复制代码

JCProto 这是什么呢?

类似于咱们在 C++中命名空间作用,这样说大家就会很好理解了。


简单的字符串或者是整型赋值写法,如下:

std::string sContent = "需要赋值的数据";cmdTest.set_s1(sContent);
复制代码

结构体赋值写法,如下:

定义Child_Test1 结构,并设置每一条数据的赋值,类似于vector的赋值,最主要的区别在于protobuf这里不是pust_back而已。
复制代码


JCProto::Child_Test1 cmdChild;cmdChild.set_s1(); //参数是需要赋值的实际内容cmdChild.set_n1(); //参数是需要赋值的实际内容
复制代码

每一条的结构写好了,接下来,该如何赋值到 repeated 中呢?这也是重点哟~


第一步:需要 new 一个 Child_Test 结构数据,相当于 C++中类的 new 的方式

JCProto::Child_Test1 *cmdChild = new JCProto::Child_Test1;cmdChild->set_s1(); //参数是需要赋值的实际内容cmdChild->set_n1(); //参数是需要赋值的实际内容cmdTest->set_allocated_test1(cmdChild);
复制代码

重点就是最后一句话,使用了 set_allocated 的方法,直接存储到 cmdSt 中,这里要看清楚了,不是 cmdChild,而是 cmdSt 中!!


最后的最后,一定要记得释放你创建的资源

cmdTest.release_test1();
复制代码

有些友友们,直接只用了之后早就忘记了释放资源了,这是不对的,如果你觉得手动释放麻烦,可以使用另一种方式,让 goole 帮你释放,例如:mutable_pos 方法


但是,我不建议使用 mutable_pos 方法,啥也没有手动释放的安全(这是不是一个 C++程序员的通病呢?)


到这里,protobuf 数据就已经组装完成了,最后直接转换成 json 格式的字符串就可以啦!

std::string sJsonData = "";JCJson2Pb::PbMsg2JsonStr(cmdTest, sJsonData);
复制代码

主要是 PbMsg2JsonStr 方法,查阅资料大家都可以找到 protobuf 与 json 的转换函数,这里也就不再说明啦!

功能 2:解析 protobuf 数据

功能 1 将 protobuf 转换成了 json 数据,那么这里,就是将 json 数据转换成 protobuf 结构了。

JCProto::Test_st1 cmdTest;//将json数据转成protobuf结构if (JCJson2Pb::JsonStr2PbMsg(sReceivedData, cmdTest) == false){    //数据解析错误,直接返回    return false;}
复制代码

JsonStr2PbMsg 这里重点的的转换函数,也是在 protobuf 与 json 转换中的。


此时,cmdTest 中已经存储好了转换后的 json 结构了,那么最主要的解析还是嵌套的结构体中,repeated


因为是类似于 vector 的容器方式,那么,在拿数据的时候也需要使用遍历的方式。获取 repeated 的大小

for(int i = 0; i < cmdTest.test1_size(); i++){    //在这里,处理每一条数据    JCProto::Child_Test1 cmdChild = cmdTest.test1(i);    //解析数据    std::string s1 = cmdChild.s1();    int n1 = cmdChild.n1();}
复制代码

是不是很类似于 vector 拿数据呢?


到这里,解析、组装 嵌套的 protobuf 结构已经讲解完成了,如果有不明白的可以留言哟!


我是中国好公民 st,一名 C++开发程序媛~

发布于: 刚刚阅读数: 5
用户头像

书山有路勤为径,学海无涯苦作舟 2022-07-01 加入

擅长语言:C++ 涉及语言:Python

评论

发布
暂无评论
C++使用protobuf嵌套结构体总结_c++_中国好公民st_InfoQ写作社区