Message对象
一)描述
1: 每一个Message对象都包含两个对象:
(1)google::protobuf::Descriptor 描述对象,是Message所有Filed的一个集合,它又包含了FieldDescriptor 对象; 每个filed都对应一个FieldDescriptor;
(2)google::protobuf::Reflection 反射对象, 通过它 + FieldDescriptor,能set/get filed对象的值;
2: 每一个Message对象,可以通过统一的对象工厂来构建, 根据协议生成了代码后,只要传入Message的名字,就能构建出对应的Message的类的实例;
二)构建message
1: 根据消息的名字来构建对应的Message类型的C++实例
google::protobuf::Message* create_message(const char* typeName)
{
google::protobuf::Message* message = NULL;
//根据名字找到message的描述对象
const google::protobuf::Descriptor* descriptor =
google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName(typeName);
if (descriptor)
{
//根据描述对象到对象工厂里,生成对应的模板对象
const google::protobuf::Message* prototype =
google::protobuf::MessageFactory::generated_factory()->GetPrototype(descriptor);
if (prototype)
{
//根据模板生成出来一个
message = prototype->New();
}
}
return message;
}
2: 删除Message: delete操作
3: 返回一个基类的指针,指向一个子类的实例;
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
#include "../proto/person.pb.h"
//根据字符串类名创建实例
google::protobuf::Message* create_message(const char* typeName)
{
google::protobuf::Message* message = NULL;
//根据名字找到message的描述对象
const google::protobuf::Descriptor* descriptor =
google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName(typeName);
if (descriptor)
{
//根据描述对象到对象工厂里,生成对应的模板对象
const google::protobuf::Message* prototype =
google::protobuf::MessageFactory::generated_factory()->GetPrototype(descriptor);
if (prototype)
{
//根据模板生成出来一个
message = prototype->New();
}
}
return message;
}
int main(int argc,char* agrv[])
{
//====================================普通创建对象=================================
#pragma region customNew
Person p;
p.set_name("jadeshu");
p.set_age(24);
p.set_email("jadeshu@qq.com");
printf("%s %s %d\n",p.name().c_str(),p.email().c_str(),p.age());
//反序列化
string strout("");
p.SerializeToString(&strout);
Person jadeshu;
jadeshu.ParseFromString(strout);
//printf("%s %s %d\n",jadeshu.name().c_str(),jadeshu.email().c_str(),jadeshu.age());
cout << jadeshu.name() <<" " << jadeshu.email()<<" " << jadeshu.age() << endl;
//==================================================================================
printf("===============================================\n");
#pragma endregion customNew
#pragma region MessageNew
//创建实例
//基类的message---->Person的实例
google::protobuf::Message* pMsgObj = create_message("Person");
Person* perCur = (Person*)pMsgObj;
perCur->set_name("wudi");
perCur->set_age(50);
perCur->set_email("xxxx@qq.com");
cout << perCur->name() <<" " << perCur->email()<<" " << perCur->age() << endl;
//删除pMsgObj
delete pMsgObj;
#pragma endregion
system("pause");
return 0;
}
三)Message获取filed描述
1: 遍历每个filed;
const Descriptor* descriptor = message->GetDescriptor();
for (int32_t index = 0; index < descriptor->field_count(); ++index) {
const FieldDescriptor* fd = descriptor->field(index);
const string& name = fd->name();
}
2: filed:
name: filed的文本名字;
is_required:是否为required 选项;
is_repeated:是否为数组;
cpp_type:返回类型;
四)Message设置filed
1: 获取Reflection
2: 根据对应的每个字段描述的类型,来设置字段;
根据字段的类型fd->ccp_type(),使用Reflection对象来设置Messsage的每一个filed;
FieldDescriptor::CPPTYPE_ENUM FieldDescriptor::CPPTYPE_UINT64 FieldDescriptor::CPPTYPE_MESSAGE
成员:
reflection->SetDouble(message, fd, value);
.....
数组:
reflection->AddDouble(message, fd, value);
.....
Message对象的更多相关文章
- 阶段一:用Handler和Message实现计时效果及其中一些疑问
“阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 本来是打算继续做天气预报的优化的,但因为某些原因,我要先把之前做的小应用优化一下.所以今天就插播一下用Handle ...
- android的消息处理机制——Looper,Handler,Message
在开始讨论android的消息处理机制前,先来谈谈一些基本相关的术语. 通信的同步(Synchronous):指向客户端发送请求后,必须要在服务端有回应后客户端才继续发送其它的请求,所以这时所有请求将 ...
- DDD 领域驱动设计-三个问题思考实体和值对象(续)
上一篇:DDD 领域驱动设计-三个问题思考实体和值对象 说实话,整理现在这一篇博文的想法,在上一篇发布出来的时候就有了,但到现在才动起笔来,而且写之前又反复读了上一篇博文的内容及评论,然后去收集资料, ...
- DDD 领域驱动设计-Value Object(值对象)如何使用 EF 进行正确映射
写在前面 首先,这篇博文是用博客园新发布的 MarkDown编辑器 编写的,这也是我第一次使用,语法也不是很熟悉,但我觉得应该会很爽,博文后面再记录下用过的感受,这边就不多说. 阅读目录: 上一篇回顾 ...
- Android之消息机制Handler,Looper,Message解析
PS:由于感冒原因,本篇写的有点没有主干,大家凑合看吧.. 学习内容: 1.MessageQueue,Looper,MessageQueue的作用. 2.子线程向主线程中发送消息 3.主线程向子线程中 ...
- Android的Message Pool是什么——源码角度分析
原文地址: http://blog.csdn.net/xplee0576/article/details/46875555 Android中,我们在线程之间通信传递通常采用Android的消息机制,而 ...
- Handler 、 Looper 、Message
分析: Looper:prepare和loop public static final void prepare() { if (sThreadLocal.get() != null) { throw ...
- 转载《Android Handler、Message》
之前也是由于周末通宵看TI3比赛,一直没找到时间写博客,导致已经有好久没更新了.惭愧!后面还会恢复进度,尽量保证每周都写吧.这里也是先恭喜一下来自瑞典的Alliance战队夺得了TI3的冠军,希望明年 ...
- android Handler.btionMessage()与Message.obtain()的区别
类概述 定义一个包含任意类型的描述数据对象,此对象可以发送给Handler.对象包含两个额外的int字段和一个额外的对象字段,这样可以使得在很多情况下不用做分配工作. 尽管Message的构造器是公开 ...
随机推荐
- Page14:状态观测器[Linear System Theory]
内容包含状态观测器设计分类及其特点 状态观测器设计与状态反馈之间的关系问题 带补偿器动态输出反馈与带状态观测器的状态反馈等价原理 由于第二部分频域部分较为简单,因此仅整理时间域部分
- [nginx] load balancing & location
一 将NGINX配置成7层load balancer,该怎么做? 参见: http://nginx.org/en/docs/http/load_balancing.html https://docs. ...
- [daily][archlinux][shell][fish] 使用最炫酷的shell工具fish
用了好久的zsh, 才知道用那么多年的bash是多么的原始. 然而比zsh更好用的其实是fish, 但是不与bash兼容, 所以最终还是选择了zsh. 关于zsh的使用,配置方法, 可以翻前文查阅. ...
- 多线程调试DLL
http://blog.csdn.net/wfq_1985/article/details/7303825
- 20165225 2017-2018-2《Java程序设计》课程总结
20165225 2017-2018-2<Java程序设计>课程总结 - 每周作业链接汇总: 预备作业一:我期待的师生关系 预备作业二:学习基础和C语言基础调查 预备作业三:linux安装 ...
- nmap常用参数
总结: 主机发现 -sn 防止NMAP端口扫描 -SP TCP 半连接扫描,默认是通过80端口来发现主机的 -SA ACK ping 扫描 -SU UDP ping 扫描 不好 ...
- JLRoutes使用
JLRoutes 地址:https://github.com/joeldev/JLRoutes JLRoutes原理: 它是通过url scheme来实现app内部,web到app,app与app之间 ...
- java的错题整理
为了阅读方便,我们写代码时要缩进,以便于更好的理解代码 对象是是具有相同属性和共同行为的一组类的实例,不是集合. B是标准格式,D没有对象接收它,所以这样子. boolean的默认值是false如果一 ...
- oracle创建索引表空间
Oracle 的索引可分为5种,它们包括唯一索引.组合索引.反向键索引.位图索引和基于函数的索引.1.创建索引的标准语法CREATE INDEX 索引名 ON 表名 (列名)TABLESPACE 表空 ...
- CSS学习(二)
<!DOCTYPE html> <html> <head> <meta charset="{CHARSET}"> <title ...