C++ 使用 protobuf 嵌套结构体总结
前面的章节讲述了如何将 protobuf 环境配置到 VS+Qt 的环境,那么这一章节就来讲述下,如何使用并解析复杂的嵌套式 protobuf 结构。
今天我们就以组装以及解析两大部分分别说明吧!
今天使用的例子如下:
当前代码只是例子,名字都是随意定义的,大家在实际项目中千万不要写成这个样子呀!你就准备接收项目经理的批评吧,哈哈!
上述 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 这是什么呢?
类似于咱们在 C++中命名空间作用,这样说大家就会很好理解了。
简单的字符串或者是整型赋值写法,如下:
结构体赋值写法,如下:
每一条的结构写好了,接下来,该如何赋值到 repeated 中呢?这也是重点哟~
第一步:需要 new 一个 Child_Test 结构数据,相当于 C++中类的 new 的方式
重点就是最后一句话,使用了 set_allocated 的方法,直接存储到 cmdSt 中,这里要看清楚了,不是 cmdChild,而是 cmdSt 中!!
最后的最后,一定要记得释放你创建的资源
有些友友们,直接只用了之后早就忘记了释放资源了,这是不对的,如果你觉得手动释放麻烦,可以使用另一种方式,让 goole 帮你释放,例如:mutable_pos 方法
但是,我不建议使用 mutable_pos 方法,啥也没有手动释放的安全(这是不是一个 C++程序员的通病呢?)
到这里,protobuf 数据就已经组装完成了,最后直接转换成 json 格式的字符串就可以啦!
主要是 PbMsg2JsonStr 方法,查阅资料大家都可以找到 protobuf 与 json 的转换函数,这里也就不再说明啦!
功能 2:解析 protobuf 数据
功能 1 将 protobuf 转换成了 json 数据,那么这里,就是将 json 数据转换成 protobuf 结构了。
JsonStr2PbMsg 这里重点的的转换函数,也是在 protobuf 与 json 转换中的。
此时,cmdTest 中已经存储好了转换后的 json 结构了,那么最主要的解析还是嵌套的结构体中,repeated
因为是类似于 vector 的容器方式,那么,在拿数据的时候也需要使用遍历的方式。获取 repeated 的大小
是不是很类似于 vector 拿数据呢?
到这里,解析、组装 嵌套的 protobuf 结构已经讲解完成了,如果有不明白的可以留言哟!
我是中国好公民 st,一名 C++开发程序媛~
版权声明: 本文为 InfoQ 作者【中国好公民st】的原创文章。
原文链接:【http://xie.infoq.cn/article/b5b37256d5d7f7d0d553edbe0】。文章转载请联系作者。
评论