protobuf复杂场景使用,包含多层结构体嵌套,repeated等成员参数情况。
1 protoc转换为.h和.cc文件
.proto文件转换为.h和.cc文件参照如下链接:
2 protobuf之.proto文件内容
message TKeyID
{
required string sg_id = 1; //设备对象编码
required string sg_column_id = 2; //
};
message TPkgHead
{
required int32 package_type = 1; //消息类型:
required int32 data_num = 2; //数据个数
required int64 second = 3; //时间,1970开始秒
required int32 msecond = 4; //时间,毫秒部分
required int32 data_source = 5; //数据源标识
};
message TChangeYx
{
required TKeyID keyid = 1; //ID
required int64 yx_id = 2; //DID
required int32 value = 3; //值
required int32 status = 4; //质量码
required int64 second = 5; //数据时间,1970开始秒
required int32 msecond = 6; //数据时间,毫秒部分
};
message TChangeYxPkg //
{
required TPkgHead package_head = 1;
repeated TChangeYx yx_seq = 2;
};
(1)TKeyID结构体为TChargeYx结构体的必须的结构体成员。
(2)TChangeYxPkg结构体包含一个必须成员TPkgHead结构体成员,一个重复的结构体成员TChargeYx。
(3)相当于有三层结构体嵌套,且有重复结果体实现。
3 程序实现代码:
#include <iostream>
#include <fstream>
#include <string>
#include "data_struct.pb.h"
using namespace std;
int main(int argc, char* argv[]) {
while(true)
{
string tmp_str;
TKeyID *KeyId = new TKeyID();;//预留结构体,是yxyc的成员
TChangeYxPkg *Yxpkg = new TChangeYxPkg();
TPkgHead *PkgHead;//存放消息头
KeyId->set_sg_id("0");
KeyId->set_sg_column_id("1");
for (int i = 0; i < 6; i++)
{
TChangeYx* tmpchangeYx = Yxpkg->add_yx_seq();
tmpchangeYx->set_allocated_keyid(KeyId);
int64_t pnt_id = 11111+ i;
int fvalue = 10000+i*2;
int q= 1;
int64_t iCurrtSoc = time(NULL);
int iCurrtMs = 20 * i;
tmpchangeYx->set_yx_id(pnt_id);
tmpchangeYx->set_value(fvalue);
tmpchangeYx->set_status(q);
tmpchangeYx->set_second(iCurrtSoc);
tmpchangeYx->set_msecond(iCurrtMs);
}
PkgHead = new TPkgHead();
int64_t iCurrtSoc = time(NULL);
int iCurrtMs = 20 ;
PkgHead->set_package_type(1000);//变化
PkgHead->set_data_num(6);
PkgHead->set_second(iCurrtSoc);
PkgHead->set_msecond(iCurrtMs);
PkgHead->set_data_source(1);
Yxpkg->set_allocated_package_head(PkgHead);
// 调⽤序列化⽅法,将序列化后的⼆进制序列存⼊string
if (!Yxpkg->SerializeToString(&tmp_str))
cout << "序列化失败." << endl;
TChangeYxPkg YxpkgTwo;
// 调⽤反序列化⽅法,读取string中存放的⼆进制序列,并反序列化出对象
if (!YxpkgTwo.ParseFromString(tmp_str))
cout << "反序列化失败." << endl;
printf("%d-%d-%ld-%d-%d\n",YxpkgTwo.package_head().package_type(),YxpkgTwo.package_head().data_num(),YxpkgTwo.package_head().second(),YxpkgTwo.package_head().msecond(),YxpkgTwo.package_head().data_source());
int iCount = YxpkgTwo.yx_seq_size();
for (int i = 0; i < iCount; i++)
{
printf("%ld-",YxpkgTwo.yx_seq(i).yx_id());
printf("%d-%d-%ld-%d\n",YxpkgTwo.yx_seq(i).value(),YxpkgTwo.yx_seq(i).status(),YxpkgTwo.yx_seq(i).second(),YxpkgTwo.yx_seq(i).msecond());
}
printf("finish\n");
sleep(5);
}
return 0;
}