c++ protobuf中repeated类型使用——序列化
Protobuf中的repeated V、map<K,V>序列化使用。
一、简单类型repeated
//定义message
message M_TEST
{repeated double dparams = 1; //double参数集repeated int32 iparams = 2; //int参数集string desc = 99; //描述
}
简单类型repeated,可以通过add_<参数名>(参数值)的方式设置值,再进行序列化;
M_TEST testpacket;
testpacket.set_desc("Demo");int i = 0;
do{double di = i + 0.001;testpacket.add_iparams(i);testpacket.add_dparams(di);i++;
} while (testpacket.ByteSize() < 1024);//填充测试数据//序列化
string strpb;
testpacket.SerializeToString(&strpb);
二、对象类型repeated
//定义协议1
message M_Person
{string name = 1; //姓名int32 age = 2; //年龄
}//定义协议2
message M_Team
{repeated M_Person member = 1; //成员信息string desc = 99; //描述
}
对象类型repeated,可以通过add_参数名()的方式设置值,再进行序列化;
M_Team teampacket;
M_Person *person;teampacket.set_desc("Demo");
person = teampacket.add_member();
person->set_name("张三");
person->set_age(33);string strpb;
teampacket.SerializeToString(&strpb);
三、多层嵌套与map<K,V>使用示例
1)协议主体示例如下:
//围棋竞赛详情
message M_Battle
{repeated M_GroupInfo junior = 1; //初中队repeated M_GroupInfo senior = 2; //高中队map<string,M_GroupInfo> teacher = 3; //教师队string desc = 99; //描述
}//队伍成员信息
message M_GroupInfo
{string nickname = 1; //昵称E_Gender gender = 2; //性别M_Project project = 3; //参赛项目string desc = 99; //描述
}//竞赛项目信息
message M_Project
{int32 id = 1; //项目IDstring name = 2; //项目名称string desc = 99; //项目描述
}//性别
enum E_Gender
{GENDER_UNKNOWN = 0; //未知GENDER_MALE = 1; //男性GENDER_FEMALE = 2; //女性
}
2)map与repeated使用示例如下:
M_Battle battlepacket;//M_Battle变量teacher:处理map类型
auto* wMap = battlepacket.mutable_teacher();
for (int i = 1; i <= 3; i++){M_GroupInfo group_teacher;//M_GroupInfo变量nicknamegroup_teacher.set_nickname("fuzi" + to_string(i));//M_GroupInfo变量gendergroup_teacher.set_gender(GENDER_UNKNOWN);//M_GroupInfo变量projectM_Project *project_teacher = new M_Project();project_teacher->set_id(i);project_teacher->set_name("teacher project" + to_string(i));project_teacher->set_desc("This is teacher project " + to_string(i));group_teacher.set_allocated_project(project_teacher);//M_GroupInfo变量descgroup_teacher.set_desc("This is group_teacher member " + to_string(i));//添加到map键值string key = "teacher" + to_string(i);(*wMap)[key] = group_teacher;
}//M_Battle变量desc:基础类型
battlepacket.set_desc("Demo");//M_Battle变量junior, senior
int i = 1;
do{M_GroupInfo* group_junior;M_GroupInfo* group_senior;M_Project *project_junior = new M_Project();M_Project *project_senior = new M_Project();project_junior->set_id(i);project_junior->set_name("junior project " + to_string(i));project_junior->set_desc("This is junior project " + to_string(i));project_senior->set_id(i*2);project_senior->set_name("senior project " + to_string(i));project_senior->set_desc("This is senior project " + to_string(i));group_junior = battlepacket.add_junior();group_junior->set_nickname("zhangsan" + to_string(i));group_junior->set_gender(GENDER_MALE);group_junior->set_allocated_project(project_junior);group_junior->set_desc("This is group_junior member " + to_string(i));group_senior = battlepacket.add_senior();group_senior->set_nickname("lisi" + to_string(i));group_senior->set_gender(GENDER_FEMALE);group_senior->set_allocated_project(project_senior);group_senior->set_desc("This is group_senior member " + to_string(i));i++;} while (battlepacket.ByteSize() < 1024);//填充数据//序列化
int size = battlepacket.ByteSize();
void *p = malloc(size);
battlepacket.SerializeToArray(p, size);//或序列化
//string strpb;
//battlepacket.SerializeToString(&strpb);
c++ protobuf中repeated类型使用——序列化相关推荐
- protobuf中 repeated[Ptr]Field的序列化
message Test1 {required int32 a = 1; }Test1 t1; t1.set_a(150); 序列化之后的结果是 08 96 01. 其中08 >>3 == ...
- protobuf repeated类型的使用
protobuf是Google开发的一个序列化框架,类似XML,JSON,基于二进制,比传统的XML表示同样一段内容要短小得多.通过protobuf,可以很轻松的调用相关方法来完成业务数据的序列 ...
- 区分 Protobuf 中缺失值和默认值
转载地址:区分 Protobuf 中缺失值和默认值 - 知乎 Protobuf 是目前非常主流的二进制序列化格式,GRPC 默认使用 Protobuf v3 格式,下面是 Protobuf 消息定义的 ...
- grpc java 泛型_gRPC中Any类型的使用(Java和NodeJs端)
工作中要把原来Java服务端基于SpringMVC的服务改为使用gRPC直接调用.由于原Service的返回值为动态的Map类型,key值不确定,且value的类型不唯一,因此使用了protobuf ...
- 解决Asp.net Mvc返回JsonResult中DateTime类型数据格式的问题
问题背景: 在使用asp.net mvc 结合jquery esayui做一个系统,但是在使用使用this.json方法直接返回一个json对象,在列表中显示时发现datetime类型的数据在转为字符 ...
- C# WebAPI中DateTime类型字段在使用微软自带的方法转json格式后默认含T的解决办法...
C# WebAPI中DateTime类型字段在使用微软自带的方法转json格式后默认含T的解决办法 原文:C# WebAPI中DateTime类型字段在使用微软自带的方法转json格式后默认含T的解决 ...
- 客户端访问Web Service--参数类型的序列化与反序列化(一)
最近开始着手学习ASP.NET AJAX,在园里看了很多关于这方面的文章,自己也曾买了关于ASP.NET AJAX的书籍,本文我将借鉴于老赵的WebCast深入浅出系列课程第五讲以记学习笔记的形式和大 ...
- java高级用法之:在JNA中使用类型映射
文章目录 简介 类型映射的本质 TypeMapper NativeMapped 总结 简介 JNA中有很多种映射,library的映射,函数的映射还有函数参数和返回值的映射,libary和函数的映射比 ...
- POJO 类中布尔类型为啥不让用 isXxx 命名
一.代码问题重现 想要使用json串在服务间传递信息时,我们会先定义一个POJO类,该类中包含是否删除属性isDeleted,代码如下 /** * @author wenxuan wang */ @D ...
- 全面理解Python中的类型提示(Type Hints)
众所周知,Python 是动态类型语言,运行时不需要指定变量类型.这一点是不会改变的,但是2015年9月创始人 Guido van Rossum 在 Python 3.5 引入了一个类型系统,允许开发 ...
最新文章
- 神经网络防止过拟合的方法
- seo建设者_前5名最佳免费和付费网站建设者
- PyQt5 笔记2 -- Qt Designer使用
- java条件执行方法_java 开启多线程里面如何加条件判断执行其他逻辑?
- C/C++插入数据到Mysql数据库中
- 在idea中使用CheckStyle来规范代码
- 基于JAVA+SpringBoot+Mybatis+MYSQL的今日头条新闻网站
- mysql.sys用户权限_MySQL用户及权限小结
- 【洛谷 P2764】 最小路径覆盖问题(最大流)
- 主成分分析法原理与MATLAB实现
- python输出斐波那契数列_Python实现斐波那契数列
- win7取消计算机密码怎么设置,Windows7取消开机密码怎么设置_Win7怎么取消开机密码?-192路由网...
- 2019烟台计算机副高职称报名时间,烟台市公共企事业单位信息公开 政策文件 2019年度职称评审工作日程安排...
- 早早起来真的可以做许多事,比如再睡一觉
- 专业查苹果测试软件,电池寿命检测软件苹果版-iphone查电池寿命appv2.1.5 iOS版-腾牛苹果网...
- excel表格如何换行
- 微信小程序iphone7设备下跳转h5页面失败,h5页面显示白屏,加载报错,其他页面正常显示
- MySQL数据库有哪些特点
- git一直输入用户名和密码的解决方法remote: HTTP Basic: Access denied fatal: Authentication failed for
- 我走过最长的路,就是XMX的套路