一)描述

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. mysql查询表死锁和结束死锁的方法

    1.查询是否锁表 show open tables where in_use>0; 2.查询进程 show processlist 查询到相对应的进程,然后 kill id 3.查看正在锁的事务 ...

  2. eclipse怎么解决Failed to load the JNIshared library

    Q: 打开eclipse打开报Failed to load the JNIshared library的错误. A:jdk的位数跟eclipse位数一致即可解决. 把eclipse下载64位即可 cm ...

  3. python json 模块

    什么是json? json是返回的是字符串格式,把python数据类型列表.字典转换成json字符串格式, 这种格式java php 其他语言都可以认识的字符串,可以跨语言交流. json,用于字符串 ...

  4. RabbitMQ -- unacked

    RabbitMQ解决大量unacked问题 为了快速响应用户请求,我们需要消息异步处理机制,比较简单的做法是用redis的List结构,我们项目使用更专业的RabbitMQ.关于redis和Rabbi ...

  5. pandas官方文档阅读收获

    1.当心它里面的简写: 第二张图中的输出实际上是等效于: df = df.drop() df 若只进行下面的操作,则drop操作不会起作用,因为它的inplace默认为False: df.drop() ...

  6. windos server 2008 r2 ftp重启教程

    1: 开始菜单输入IIS 2: SERVER> 网站> 站点 >重新启动. 3: 输入ftp://localhost   ,  输入用户名和密码.登录.

  7. spring boot 启动类一定要放置到包的根目录下,也就是和所有包含java文件的包在同一级目录。如果不放置在根目录下,将会提示 no mybatis mapper was found

    spring boot 启动类一定要放置到包的根目录下,也就是和所有包含java文件的包在同一级目录.将会将同一目录下的包扫描成bean. 如果不放置在根目录下,将会提示 no mybatis map ...

  8. PHP策略模式1

    [IUser.php] <?php /** * 策略模式 * 将一组特定的行为和算法封装成类,用来适应某些特定的上下文环境,实现从硬编码到解耦 * 应用举例:电商系统针对不同性别跳转到不同的商品 ...

  9. 【LeetCode每天一题】 Merge k Sorted Lists(合并K个有序链表)

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...

  10. canvas原生js写的贪吃蛇

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...