ProtoBuf 中的反射

栏目: 服务器 · 发布时间: 5年前

内容简介:点击上方蓝色文字“后端技术小黑屋”,关注茄子拯救世界的公众号吧~同时写Python和C++的程序员,往往会觉得C++写起来很累。(所谓

ProtoBuf 中的反射

点击上方蓝色文字“后端技术小黑屋”,关注茄子拯救世界的公众号吧~

同时写 Python 和C++的程序员,往往会觉得C++写起来很累。(所谓 “累守恒定律” : 程序执行时的累 + 程序员写代码时的累 = 恒定的累^_^)

在处理ProtoBuf Message数据时,经常会有这样的需求,根据一个输入的字符串,找到Message中对应属性的取值;或者根据输入的字符串和一个值,设置Message中对应属性的取值。

这种需求放在Python中,往往直接通过getattr/setattr就能一步搞定。但是在C++中,我们不得不借助于ProtoBuf的反射机制。

这里,需要介绍如下几个概念:

google :: protobuf :: Message

Message是protobuf中的基本类型,protobuf中所有自定义对象都继承自Message。

通过Message我们可以获得Message的Descriptor和Reflection。

google :: protobuf :: Descriptor

Descriptor正如其名,是对Message的描述,包括字段个数,所有字段的描述等等。

通过Descriptor,我们可以获得一个字段的FieldDescriptor。

google :: protobuf :: Reflection

Reflection就是具体执行相关反射操作,比如当拿到了Message的FieldDescriptor,就可以通过Reflection来读写这个字段。

google :: protobuf :: FieldDescriptor

FieldDescriptor是用于描述字段的,比如字段的类型、名字、修饰符(repeated/required/optional)等。

code snippet

有了上面的这四大金刚,根据输入的字符串,动态的从Message中获得属性的值,可以用以下这段代码片段搞定:

bool GetInt32FieldValue(const google::protobuf::Message& message,
                        const std::string &field_name,
                        int32_t* value) {
  if (value == NULL) {
    return false;
  }
  const Reflection *reflection = message.GetReflection();
  const Descriptor *descriptor = message.GetDescriptor();
  const FieldDescriptor *field = descriptor->FindFieldByName(field_name);
  if (field->cpp_type() != FieldDescriptor::CPPTYPE_INT32) {
    return false;
  }
  if (field->is_repeated()) {
    return false;
  }
  *value = reflection->GetInt32(message, field);
  return true;
}

这里只是示意了获取简单类型的方式,获取Repeated类型可以用Reflection的GetRepeatedInt32函数;而获取嵌套的Message则可以用Reflection的GetMessage函数。

推荐阅读:

线程数与多核CPU的关系

踩坑记:临界区内要小心

protobuf中set_allocated_xxx排雷

题图:mambeau

授权:CC0协议

ProtoBuf 中的反射


以上所述就是小编给大家介绍的《ProtoBuf 中的反射》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

产品的视角:从热闹到门道

产品的视角:从热闹到门道

后显慧 / 机械工业出版社 / 2016-1-1 / 69.00

本书在创造性的提出互联网产品定义的基础上,为读者提供了一个从0基础到产品操盘手的产品思维培养方法! 全书以互联网产品定义为基础,提出了产品思维学习的RAC模型,通过认识产品、还原产品和创造产品三个阶段去培养产品思维和产品认知。 通过大量的图片和视觉引导的方法,作者像零基础的用户深入浅出的描绘了一条产品经理的自我修养路径,并且提供了知识地图(knowledge map)和阅读雷达等工具,......一起来看看 《产品的视角:从热闹到门道》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码