protobuf复杂场景下的使用,包含多层嵌套结构体,repeated等(六)

文章介绍了在protobuf中处理复杂场景,包括TKeyID、TPkgHead和TChangeYx结构体的定义,重点展示了如何在程序中创建多层嵌套结构和使用repeated字段,并演示了序列化和反序列化的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

protobuf复杂场景使用,包含多层结构体嵌套,repeated等成员参数情况。

1 protoc转换为.h和.cc文件

.proto文件转换为.h和.cc文件参照如下链接:

protobuf之实例使用(四)-CSDN博客

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;
}

4 编译执行后的序列化结果显示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值