信息传递工具protobuf通过pb的反射来赋值

最近因为项目逻辑方面都做的差不多了,于是赶紧去做做测试工作,免得项目上线之后出问题,于是打算用配置的形式做一个类似与白盒测试工具的东西出来。

因为项目使用pb来做协议通讯,所以配置的xml也是类似于pb,将pb的字段和类型配置进去,然后加上值,一个协议结构就可以了,现在只能通过修改值来做测试,后面会改动的更智能化一些,例如某个行为的次数,某个行为更随机等等。

去读了一下陈硕的关于pb处理协议的反射,学到了不少东西,同时对pb的一些东西理解更深刻了,google还是大牛很多。

1.如何处理pb的反射,通过协议字串动态生成一个协议

pb提供了一个强大的DescriptorPool::generated_pool()

代码如下:

 代码如下 复制代码
inline google::protobuf::Message* CreateMessage(const std::string& msg)
{
    google::protobuf::Message* message = NULL;
    const google::protobuf::Descriptor* descriptor = google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName("ProtoMsg." + msg);
    if (descriptor)
    {
        const google::protobuf::Message* prototype = google::protobuf::MessageFactory::generated_factory()->GetPrototype(descriptor);
        if (prototype)
        {
            message = prototype->New();
        }
    }

    return message;
}

inline void ReleaseMessage(google::protobuf::Message* pMsg)
{
    if (NULL != pMsg)
    {
        pMsg->Clear();
        delete pMsg;
    }
}

这两个函数可以动态生成pb的message,其中ProtoMsg是你pb package的名字

2.通过反射将配置中的值设置进pb字段

pb的Message基类提供了一个Reflection,这个类非常强大

代码如下

 代码如下 复制代码
// mstrCurMsg 当前正在执行的协议
google::protobuf::Message* pMsg = Test::CreateMessage(mstrCurMsg);
const google::protobuf::Descriptor* pDescriptor = google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName("ProtoMsg." + mstrCurMsg);
assert(NULL != pDescriptor);

// 这一个可以获取到反射类,然后可以将配置中值赋值进去
const google::protobuf::Reflection* pReflection = pMsg->GetReflection();
assert(NULL != pReflection);

for (int i = 0; i < pDescriptor->field_count(); ++i)
{
    const google::protobuf::FieldDescriptor* pFieldDescriptor = pDescriptor->field(i);
    assert(NULL != pFieldDescriptor);

    const std::string& strFieldName = pFieldDescriptor->name();
   
    const TestConfigModule::MsgEntry* pMsgEntry = pMsgStruct->GetMsgEntry(strFieldName);
    assert(NULL != pMsgEntry);

    // 读取字段类型,顺带可以做类型检查
    assert(pMsgEntry->mnType == pFieldDescriptor->type());

    // 设置值
    switch (pMsgEntry->mnType)
    {
    case Test::TYPE_STRING:
        pReflection->SetString(pMsg, pFieldDescriptor, pMsgEntry->mstrValue);
        break;
    // ...
    default:
        break;
    }
}

std::string strData;
if (!pMsg->SerializeToString(&strData))
{
    m_pLogModule->LogNormal("Test stop, cannot SerializeToString ", mstrCurMsg, __FUNCTION__, __LINE__);
    return;
}

Test::ReleaseMessage(pMsg);

通过这样的步骤,就可以自动创建message和对field赋值了

时间: 2024-07-29 03:04:22

信息传递工具protobuf通过pb的反射来赋值的相关文章

WWW 与人际沟通和信息传递的关系

 [第一部份]:WWW 与人际沟通和信息传递的关系 一:信息爆炸时代最热门的人际沟通方式 人类即将进入二十一世纪,一个信息爆炸时代.在这时代,最热门的人际沟通方式是多媒体的沟通方式. 人类生活在这个世界,经常运用五种不同的感觉﹝sense﹞与外界沟通.同时也运用表征﹝representation﹞的方式将我们从外界所得到的讯息组织起来,进一步再将它们诠释. 人类透过不同感觉所得到的不同讯息之间会互相影响.为了增加沟通的效果,人类常用不同形式的媒体与不同的沟通方式表达自己的意念.譬如人类说话时经常

小弟新手,求大神怎么将web中的注册登录信息传递给数据库?

问题描述 小弟新手,求大神怎么将web中的注册登录信息传递给数据库? 最近刚接触asp.net,有很多地方不明白,还请大神给一一指点迷津. 项目背景:要做一个web网站,网站具备以下功能: 1)web界面可以进行注册和登录,要求把注册的信息写入到数据库中. 2)登录时,可以将输入的数据与数据库进行比对,密码错误则跳转另一个页面,密码正确则转向主界面. 小弟主要有以下几点不明白,还请大神们给出详细的解答. 1)开发都需要哪些开发工具.(ps,只用VS是否可以完成前端和后端的所有工作?) 2)我想采

全球连接和信息传递的速度已经从根本上改变了我们的世界

中国网3月6日讯 网络空间已经将继续改变我们实施职业武器的方法从步兵到信号兵,从情报分析员到战场指挥官.全球连接和信息传递的速度已经从根本上改变了我们的世界,我们再也回不到从前了.技术将继续演变,在应对当今的威胁同时建设未来.我们必须了解这一变化的驱动力及其影响.在这方面没有什么比了解和减缓风险更为重要的了.要实现这一切,必须实施标准化纠正偏差实行用户行为模式,这些目前统称为遵守(compliance ).陆军的基石是标准和纪律,在网络空间领域,我们必须有纪律约束. 遵守信息保障是陆军网络司令部

技术-如何在Azure环境里做好信息传递

问题描述 如何在Azure环境里做好信息传递 如何根据客户要求建立一个基于Windows Azure技术的复杂远程信息处理应用 解决方案 直接把lync部署到Windows Azure中,或者,干脆直接使用Office 365 Enterprise就可以了. 解决方案二: 如果可以的话,把客户要求列出一些来,大家才好给出建议,毕竟客户要求有的时候是不合理的,必须要具体分析

ie 9-IE9及以上浏览器跨域信息传递失败,求帮忙指点

问题描述 IE9及以上浏览器跨域信息传递失败,求帮忙指点 我想在页面上做跨域消息传递,于是用了以下方法,可是在IE9及以上浏览器测试失败,请问各位有没有什么好的解决方法供小弟用以下,感激不尽. if(window.addEventListener) window.addEventListener("message", receiveData, false); else window.attachEvent("onmessage", receiveData); 解决方

谈我对阿里巴巴排名信息重发工具的看法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 对于长期泡阿里巴巴的人来说,更新信息,重发信息都是一种体力活,一般人肯定都听过网上销售的一些辅助工具,是不是有一种尝试,购买的冲动?还有人不知道阿里巴巴信息重发工具的吗?或者叫阿里巴巴排名优化工具.我这里简要介绍一下,一句话概括就是用了阿里巴巴信息重发软件,腰不酸,手不累,一开软件实现自动重发信息. 阿里巴巴信息重发软件的诱惑宣传让我想起了昔

网站综合信息查询工具大揭秘(asp+xmlhttp)

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 此类工具很多是通过asp+xmlhttp抓取官方页面信息(一般是国外网站),再二次整理.汉化,以便国内站长查看! 废话少说,现在就把此类工具的实现原理简单给大家说说,相信你读了此文后也可以很轻松的写出此类工具! 1.Alexa详细信息查询工具 此类工具分为两种 1.通过Alexa官方API接口获取信息,此类查询每千次查询需要向alexa支付

jbpm4.4怎么将父流程的一些信息传递到子流程中

问题描述 jbpm4.4怎么将父流程的一些信息传递到子流程中 是用jbpm4.4 在父流程中嵌套一个子流程,现在想将父流程中的一些信息传递到子流程中使用,求大神指导如何传递过去

隐藏-将jsp页面上的信息传递到action中

问题描述 将jsp页面上的信息传递到action中 各位大神,求帮忙!!! 页面上的信息是这样: <table class="tabmenu" <c:if test="${fn:length(tabmap) < 2}">style="display:none"</c:if>> <tr> <c:forEach var="tab" items="${tabmap