当前位置:网站首页>protobuf 反射使用总结
protobuf 反射使用总结
2022-08-03 16:05:00 【litanyuan】
背景
反射是指可以动态获取任意类的属性和方法以及动态调用任意对象的属性和方法的机制。C++ 本身没有反射机制,但通过 protobuf 可以在运行时获取和修改对象的字段。
反射相关类
①.Descriptor
Descriptor 包含了对 message 的描述,以及其所有字段的描述。
②.FieldDescriptor
FieldDescriptor 包含了对 message 中单个字段的详细描述。
③.Reflection
Reflection 提供了对 message 中单个字段进行动态读写的方法。
使用反射创建 message
①.概述
DescriptorPool 中存储了所有 message 的元信息;
MessageFactory 是一个实例创建工厂,可以根据 message 的描述信息得到其默认实例;
根据类型的默认实例可以创建同类型的 message 对象;
mesaage 的类型名称要带上其 package 名称。
②.示例 message
message DemoMsg
{
int32 id = 1;
string name = 2;
}
③.使用反射创建 message
auto getMessageByName = [](const string & msgType){
auto desc = google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName(msgType);
if (!desc) return shared_ptr<google::protobuf::Message>(nullptr);
auto instance = google::protobuf::MessageFactory::generated_factory()->GetPrototype(desc);
if (!instance) return shared_ptr<google::protobuf::Message>(nullptr);
std::shared_ptr<google::protobuf::Message> msg = std::shared_ptr<google::protobuf::Message>(instance->New());
return msg;
};
string msgType = "protoTest.DemoMsg";
auto msg = getMessageByName(msgType);
if (msg) cout << msgType << " 创建成功" << endl;
使用反射读写字段
①.概述
根据 message 的描述可以得到字段的描述;
使用 message 的反射和字段的描述可以进行字段值的读写。
②.使用反射设置字段值
string msgType = "protoTest.DemoMsg";
auto msg = getMessageByName(msgType);
auto desc = msg->GetDescriptor();
auto refl = msg->GetReflection();
auto field = desc->FindFieldByName("name");
refl->SetString(msg.get(), field, "1234");
cout << msg->DebugString() << endl;
③.使用反射读取字段值
if( refl->HasField(*msg, field) )
cout << refl->GetString(*msg, field) << endl;
使用反射遍历字段
①.概述
使用反射可以在运行时对 message 的所有字段进行遍历。
②.使用反射遍历字段
protoTest::DemoMsg msg;
auto desc = msg.GetDescriptor();
auto refl = msg.GetReflection();
int size = desc->field_count();
for (int i = 0; i < size; ++i)
{
auto field = desc->field(i);
cout << field->name() << " " << field->type_name() << endl;
}
边栏推荐
- 【Unity入门计划】基本概念(7)-Input Manager&Input类
- Awesome!Coroutines are finally here!Thread is about to be in the past
- 视频人脸识别和图片人脸识别的关系
- MATLAB | 七夕节快到了,还不给朋友安排上这个咕呱小青蛙?
- 移动应用出海,你的“网络优化”拖后腿了吗?
- 如何设计大电流九线导电滑环
- How to analyze the weekly activity rate?
- [Unity Getting Started Plan] Basic Concepts (8) - Tile Map TileMap 01
- 技术干货|如何将 Pulsar 数据快速且无缝接入 Apache Doris
- How to start an NFT collection
猜你喜欢
随机推荐
[QT] Qt project demo: data is displayed on the ui interface, double-click the mouse to display specific information in a pop-up window
DataGrip:非常好用的数据库工具,安装与使用教程,亮点介绍
为什么我强烈推荐使用智能化async?
机器人开发--Universal Scene Description(USD)
Why do I strongly recommend using smart async?
攻防世界----bug
Yii2安装遇到Loading composer repositories with package information
Cookie和Session的关系
smp,numa和mpp体系结构总结
高可用版 主数据库数据结构改变 备数据库会自动改变吗
如何使用MATLAB绘制极坐标堆叠柱状图
美国国防部更“青睐”光量子系统研究路线
泰山OFFICE技术讲座:文字边框高度研究
Analysis of ffplay video playback principle
如何启动 NFT 集合
Common distributed theories (CAP, BASE) and consensus protocols (Gosssip, Raft)
leetcode: 899. Ordered Queue [Thinking Question]
Kubernetes 笔记 / 入门 / 生产环境 / 用部署工具安装 Kubernetes / 用 kubeadm 启动集群 / 安装 kubeadm
13 and OOM simulation
【翻译】关于扩容一个百万级别用户系统的六个课程