protobuf通过反射来赋值

作者: NickYang 分类: 技术文章,程序开发 发布时间: 2014-11-26 20:48

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

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

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

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

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

代码如下:

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

 

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

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

代码如下

通过这样的步骤,就可以自动创建message和对field赋值了,如果你也有pb的使用经验和技巧,欢迎分享

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

21条评论
  • 2016 年 4 月 21 日 14:47

    我觉得很奇怪,最终目的是:通过一个指针创建一个对象。第一幅图已经实现了啊~~~后面的没有必要吧

    潜水 Chrome浏览器 Windows 7 x64 Edition
    1. NickYang

      2016 年 4 月 21 日 15:14

      我不是特别明白你的意思。第一个函数段只是创建Message指针,第二段函数是对这个Msg进行反射赋值。

      站长 Chrome浏览器 Windows 7 x64 Edition
  • 李阳博客

    2016 年 1 月 23 日 19:52

    最近我也在接触这个东西,好久之前还自学过,现在又重新来了。

    冒泡 Chrome浏览器 Windows 10 x64 Edition
    1. NickYang

      2016 年 1 月 23 日 21:26

      还是挺简单的,看一会儿就会了

      站长 Chrome浏览器 Windows 7 x64 Edition
  • Noha

    2015 年 6 月 19 日 09:58

    最近写了一个协议调试工具,通过协议文件,在界面上填充字段就可以发送协议了。用的就是这个反射机制。

    潜水 Chrome浏览器 Windows 7 x64 Edition
  • Yu

    2015 年 2 月 4 日 15:05

    我想在cmake上使用protobuf,然后找到一个工程,但是有些错误…请问可以帮看下么? https://github.com/yujing5b5d/cmake-proto

    神话 其它浏览器 其它操作系统
    1. eliteYang

      2015 年 2 月 4 日 19:52

      具体错误是啥?

      神话 其它浏览器 其它操作系统
    2. eliteYang

      2015 年 2 月 4 日 20:03

      看到错误了,你试试加上上两层,../../试试,这样看看能不能找到那个文件

      神话 其它浏览器 其它操作系统
      1. Yu

        2015 年 2 月 4 日 20:55

        好像还是继续错.. “Backslashes, consecutive slashes, “.”, or “..” are not allowed in the virtual path”我觉得可能有什么参数可以设置proto的ROOT…但是好像不太好找..

        神话 其它浏览器 其它操作系统
        1. eliteYang

          2015 年 2 月 5 日 09:43

          今天我更新下来试试先,貌似CMakeList.txt需要每个文件夹下都有一份吧

          神话 其它浏览器 其它操作系统
          1. Yu

            2015 年 2 月 5 日 10:41

            ADD_SUBDIRECTORY(sub_dir) 后 sub_dir下才需要个吧我记得..

            神话 其它浏览器 其它操作系统
          2. Yu

            2015 年 2 月 5 日 10:52

            我又更新了下,add subdirectory后发现那个include path问题解决了..不过还有些问题… error: no member named ‘protobuf_AddDesc_common_2ffoo_2ffoo_2eproto’ in the global namespace啊….略困难啊…多有麻烦了

            神话 其它浏览器 其它操作系统
            1. eliteYang

              2015 年 2 月 5 日 11:35

              貌似你没生成pb的cc和h文件吧,我在windows下用cmake gui试下来是cmake的lib和include没找到,我手动设置之后,直接是没有任何问题的

              神话 其它浏览器 其它操作系统
            2. eliteYang

              2015 年 2 月 5 日 11:36

              还有,加下QQ吧,聊起来方便,362148418

              神话 其它浏览器 其它操作系统
              1. Yu

                2015 年 2 月 5 日 13:36

                加了..验证信息是”Yu”

                神话 其它浏览器 其它操作系统
                1. eliteYang

                  2015 年 2 月 5 日 20:20

                  嗯,已经通过了

                  神话 其它浏览器 其它操作系统
  • 李阳博客

    2014 年 12 月 3 日 10:36

    只用过JAVA的反射机制。。。。

    活跃 其它浏览器 其它操作系统
    1. eliteYang

      2014 年 12 月 3 日 10:51

      java,C#是天生的反射,C++木有啊

      神话 其它浏览器 其它操作系统
      1. 李阳博客

        2014 年 12 月 6 日 09:56

        哈哈,因为C++是纯纯的面向对象呀哈哈,帮你点广告啦

        活跃 其它浏览器 其它操作系统
        1. eliteYang

          2014 年 12 月 7 日 22:15

          哈哈……感谢支持

          神话 其它浏览器 其它操作系统
  • 香港服务器

    2014 年 11 月 29 日 13:52

    亲,我这里有个独立ip主机3.8折的广告推荐给你如何?佣金10%,如果可以的话,请加我qq:2954243953

    潜水 其它浏览器 其它操作系统

发表评论

电子邮件地址不会被公开。 必填项已用*标注