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的构造器是公开 ...
随机推荐
- odoo10如何自定义自动生成单据编号
1.在已有的model中穿件一个字段name class qingjiadan(models.Model): _name = 'qingjia.qingjiadan' name = fields.Ch ...
- Python3+Selenium环境配置
一.所需工具 1.Python3.6安装包 2.Selenium安装包(selenium-server-standalone-3.8),如果是Python3的话可以不用下载selenium压缩包,Py ...
- SQL union介绍
UNION 操作符用于合并两个或多个 SELECT 语句的结果集 UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 SELECT 语句中的列的顺序必须 ...
- Win10系统桌面右键新建没有内容怎么恢复
Win10系统桌面右键新建没有内容怎么恢复 添加txt文本文档 运行->regedit,打开注册表编辑器 展开HKEY_CLASSES_ROOT 找到.txt 选中.txt,修改右侧窗格的“默认 ...
- golang 死锁
golang中for{}会引起程序死锁 如: main(){ go func(){fmt.Println("dfkdsf")} for{ } } 程序运行一会会停止 按照下面的写法 ...
- win10下切换多个jdk版本
1.每次切换时,修改JAVA_HOME变量 2.编辑path环境变量,如图所示,将%JAVA_HOME%\jre\bin和%JAVA_HOME%\bin移到最上边 3.在控制面板中打开java控制面板 ...
- SpringBoot静态资源访问
在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置: Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /static ...
- django基础-02:虚拟环境
4. 虚拟环境 4.1 概念 之前安装python包的命令: sudo pip3 install 包名 包的安装路径:/usr/local/lib/python3.5/dist-packages 在同 ...
- (4.6)mysql备份还原——深入解析二进制日志(2)binlog参数配置解析
关键词:binlog配置,binlog参数,二进制日志配置,二进制文件参数配置 关键词:binlog缓存,binlog 刷新 0.bin写入流程 写binlog流程如下:# 数据操作buffer po ...
- git出现warning: LF will be replaced by CRLF的解决方法
今天ytkah用git上传文件的时候出现了warning: LF will be replaced by CRLF的错误,具体信息如下,这是因为跨平台开发下产生的.由于编辑器的不同或者Windows程 ...