当前位置:   article > 正文

读Muduo源码笔记---7(Protobuf)_mudo protobuffer

mudo protobuffer

1、概念

   Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。
    将 程序数据转化成能被存储并传输的格式的过程被称为“序列化”(Serialization),而它的逆过程则可被称为“反序列化” (Deserialization)。

     简单来说,序列化就是将对象实例的状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它根据流重构对象。这两个过程结合起来,可以轻 松地存储和传输数据。

  序列化:将对象变成字节流的形式传出去。      反序列化:从字节流恢复成原来的对象。

protobuf的反射功能

  

  1. Message:Person是自定义的pb类型,继承自Message. MessageLite作为Message基类,更加轻量级一些。
    通过Message的两个接口GetDescriptor/GetReflection,可以获取该类型对应的Descriptor/Reflection。

  2. Descriptor:Descriptor是对message类型定义的描述,包括message的名字、所有字段的描述、原始的proto文件内容等,提供的接口:获取所有字段的个数:int field_count() const   获取单个字段描述类型FieldDescriptor的接口 。

  3. FieldDescriptor:描述message中的单个字段,例如字段名,字段属性(optional/required/repeated)等。

  4. Reflection:提供了动态读写pb字段的接口,对pb对象的自动读写主要通过该类完成。对每种类型,Reflection都提供了一个单独的接口用于读写字段对应的值。

  1. //读操作
  2. virtual int32 GetInt32 (const Message& message,const FieldDescriptor* field) const = 0;
  3. virtual int64 GetInt64 (const Message& message,const FieldDescriptor* field) const = 0;
  4. //对于枚举和嵌套的message
  5. virtual const EnumValueDescriptor* GetEnum(const Message& message, const FieldDescriptor* field) const = 0;
  6. virtual const Message& GetMessage(const Message& message,const FieldDescriptor* field,MessageFactory* factory = NULL) const = 0;

       反射使用

  • 通过类型名创建类型对象
  1. // 先获得类型的Descriptor .
  2. auto descriptor = google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName("T.Test");
  3. if (nullptr == descriptor)
  4. {
  5. return 0 ;
  6. }
  7. // 利用Descriptor拿到类型注册的instance. 这个是不可修改的.
  8. auto prototype = google::protobuf::MessageFactory::generated_factory()->GetPrototype(descriptor);
  9. if ( nullptr == descriptor)
  10. {
  11. return 0 ;
  12. }
  13. // 构造一个可用的消息.
  14. auto message = prototype->New();
  15. // 只有当我们预先编译了test消息并且正确链接才能这么干.
  16. auto test = dynamic_cast<T::Test*>(message);
  17. // 直接调用message的具体接口
  18. // 其实这些接口是语法糖接口.所以并没有对应的反射机制来对应调用.
  19. // 反射机制实现了的Set/Get XXX系列接口,是属于Reflection的接口,接收Message作为参数.
  20. test->set_id(1);
  • 通过对象和对象的属性的名字获取、修改对应的属性
  1. // 拿到一个对象,不在乎怎么拿到,可以是通过反射拿到。
  2. // 这里简单直接的创建一个.
  3. T::Test p_test ;
  4. // 拿到对象的描述包.
  5. auto descriptor = p_test.GetDescriptor() ;
  6. // 拿到对象的反射配置.
  7. auto reflecter = p_test.GetReflection() ;
  8. // 拿到属性的描述包.
  9. auto field = descriptor->FindFieldByName("id");
  10. // 设置属性的值.
  11. reflecter->SetInt32(&p_test , field , 5 ) ;
  12. // 获取属性的值.
  13. std::cout<<reflecter->GetInt32(p_test , f
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/634124
推荐阅读
相关标签
  

闽ICP备14008679号