一)描述

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对象的更多相关文章

  1. 阶段一:用Handler和Message实现计时效果及其中一些疑问

    “阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 本来是打算继续做天气预报的优化的,但因为某些原因,我要先把之前做的小应用优化一下.所以今天就插播一下用Handle ...

  2. android的消息处理机制——Looper,Handler,Message

    在开始讨论android的消息处理机制前,先来谈谈一些基本相关的术语. 通信的同步(Synchronous):指向客户端发送请求后,必须要在服务端有回应后客户端才继续发送其它的请求,所以这时所有请求将 ...

  3. DDD 领域驱动设计-三个问题思考实体和值对象(续)

    上一篇:DDD 领域驱动设计-三个问题思考实体和值对象 说实话,整理现在这一篇博文的想法,在上一篇发布出来的时候就有了,但到现在才动起笔来,而且写之前又反复读了上一篇博文的内容及评论,然后去收集资料, ...

  4. DDD 领域驱动设计-Value Object(值对象)如何使用 EF 进行正确映射

    写在前面 首先,这篇博文是用博客园新发布的 MarkDown编辑器 编写的,这也是我第一次使用,语法也不是很熟悉,但我觉得应该会很爽,博文后面再记录下用过的感受,这边就不多说. 阅读目录: 上一篇回顾 ...

  5. Android之消息机制Handler,Looper,Message解析

    PS:由于感冒原因,本篇写的有点没有主干,大家凑合看吧.. 学习内容: 1.MessageQueue,Looper,MessageQueue的作用. 2.子线程向主线程中发送消息 3.主线程向子线程中 ...

  6. Android的Message Pool是什么——源码角度分析

    原文地址: http://blog.csdn.net/xplee0576/article/details/46875555 Android中,我们在线程之间通信传递通常采用Android的消息机制,而 ...

  7. Handler 、 Looper 、Message

    分析: Looper:prepare和loop public static final void prepare() { if (sThreadLocal.get() != null) { throw ...

  8. 转载《Android Handler、Message》

    之前也是由于周末通宵看TI3比赛,一直没找到时间写博客,导致已经有好久没更新了.惭愧!后面还会恢复进度,尽量保证每周都写吧.这里也是先恭喜一下来自瑞典的Alliance战队夺得了TI3的冠军,希望明年 ...

  9. android Handler.btionMessage()与Message.obtain()的区别

    类概述 定义一个包含任意类型的描述数据对象,此对象可以发送给Handler.对象包含两个额外的int字段和一个额外的对象字段,这样可以使得在很多情况下不用做分配工作. 尽管Message的构造器是公开 ...

随机推荐

  1. Page14:状态观测器[Linear System Theory]

    内容包含状态观测器设计分类及其特点 状态观测器设计与状态反馈之间的关系问题 带补偿器动态输出反馈与带状态观测器的状态反馈等价原理 由于第二部分频域部分较为简单,因此仅整理时间域部分

  2. [nginx] load balancing & location

    一 将NGINX配置成7层load balancer,该怎么做? 参见: http://nginx.org/en/docs/http/load_balancing.html https://docs. ...

  3. [daily][archlinux][shell][fish] 使用最炫酷的shell工具fish

    用了好久的zsh, 才知道用那么多年的bash是多么的原始. 然而比zsh更好用的其实是fish, 但是不与bash兼容, 所以最终还是选择了zsh. 关于zsh的使用,配置方法, 可以翻前文查阅. ...

  4. 多线程调试DLL

    http://blog.csdn.net/wfq_1985/article/details/7303825

  5. 20165225 2017-2018-2《Java程序设计》课程总结

    20165225 2017-2018-2<Java程序设计>课程总结 - 每周作业链接汇总: 预备作业一:我期待的师生关系 预备作业二:学习基础和C语言基础调查 预备作业三:linux安装 ...

  6. nmap常用参数

    总结: 主机发现 -sn    防止NMAP端口扫描 -SP    TCP 半连接扫描,默认是通过80端口来发现主机的 -SA    ACK ping 扫描 -SU    UDP ping 扫描 不好 ...

  7. JLRoutes使用

    JLRoutes 地址:https://github.com/joeldev/JLRoutes JLRoutes原理: 它是通过url scheme来实现app内部,web到app,app与app之间 ...

  8. java的错题整理

    为了阅读方便,我们写代码时要缩进,以便于更好的理解代码 对象是是具有相同属性和共同行为的一组类的实例,不是集合. B是标准格式,D没有对象接收它,所以这样子. boolean的默认值是false如果一 ...

  9. oracle创建索引表空间

    Oracle 的索引可分为5种,它们包括唯一索引.组合索引.反向键索引.位图索引和基于函数的索引.1.创建索引的标准语法CREATE INDEX 索引名 ON 表名 (列名)TABLESPACE 表空 ...

  10. CSS学习(二)

    <!DOCTYPE html> <html> <head> <meta charset="{CHARSET}"> <title ...