Protobuf Reflection 反射使用

Protobuf Reflection 反射使用

源码地址:https://github.com/Michaelzhouisnotwhite/DemoCXXCode/blob/main/src/protobuf-reflection/main.cpp
首先创建一个proto文件:

syntax = "proto3";// option optimize_for = LITE_RUNTIME; // 不使用MessageLitepackage pb;message Data {uint64 id = 1;string value = 2;
}
message DataList {repeated Data data = 1;int64 uid = 2;
}

NOTE 如何生成pb.c文件不赘述了

如何实现反射:

创建一个动态读取proto的importer

google::protobuf::compiler::DiskSourceTree source_tree{};// proto文件夹
source_tree.MapPath("proto",PROTO_ROOT_PATH);google::protobuf::compiler::Importer importer(&source_tree, nullptr);
const auto* desp = importer.Import("proto/test_msg.proto"); // 从文件夹导入文件

获得proto中的pb.DataList消息

const auto* desp_pool = desp->pool(); // 列出文件中所有描述器
const auto* msg_desp = desp_pool->FindMessageTypeByName("pb.DataList"); // 找到messagegoogle::protobuf::DynamicMessageFactory factory; // 创建工厂
auto* msg = factory.GetPrototype(msg_desp)->New(); // 得到目标message然后创建msg->ParseFromString(data_list_raw_data); // 解析

动态解析所有message中的field

auto parse_msg_field(const google::protobuf::Message* msg, int recurtion_level) -> void {const auto* ref = msg->GetReflection(); // 得到message的反射const auto* desp2 = msg->GetDescriptor(); // 得到message的描述器auto prefix = std::string("  ", recurtion_level);for (int i = 0; i < desp2->field_count(); ++i) {auto field = desp2->field(i);fmt::print("{}", prefix);fmt::print("{}   {}   {}    {}", field->number(), field->type_name(),field->cpp_type_name(), field->name());if (field->message_type()) {// fmt::println("current field is a message type");}switch (field->cpp_type()) {case google::protobuf::FieldDescriptor::CPPTYPE_INT64: {fmt::println("   {}", ref->GetInt64(*msg, field));}break;case google::protobuf::FieldDescriptor::CPPTYPE_STRING: {fmt::println("   {}", ref->GetString(*msg, field));}break;case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: {fmt::println("   {}", ref->GetUInt64(*msg, field));}break;case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE: {fmt::println("");if (field->is_repeated()) {for (int rid = 0; rid < ref->FieldSize(*msg, field); rid++) {parse_msg_field(&ref->GetRepeatedMessage(*msg, field, rid),recurtion_level + 1);}}}break;default: {fmt::print("{}", prefix);fmt::println("can't parse type: {} {}", field->type_name(), field->name());}break;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/31342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8改进 | FPN | 新型上采样算子CARAFE【全网独家】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有40篇内容&#xff0c;内含各种Head检测头、损失函数Loss、…

什么?CSS 要支持内联条件语句!

CSS 工作组&#xff08;WG&#xff09;决定在 CSS 中添加一个内联的 if() 函数。本文解读 if() 函数的设计理念与应用场景&#xff0c;对比其与 style queries 的差异&#xff0c;展示在复杂条件处理上的独特优势。 CSS 工作组决定在 CSS 中添加一个内联的 if() 函数 上周&am…

小程序大作为|小程序开发详细流程,新手也能轻松掌握

随着移动互联网的快速发展&#xff0c;小程序作为一种轻量级应用&#xff0c;因其无需下载安装、即点即用、用完即走的特点&#xff0c;受到了广大用户的青睐。那么开发小程序都有哪些开发流程呢&#xff1f;可以用哪种方式开发&#xff1f;选择合适的开发方式&#xff0c;一起…

小程序知识点:Vant!!!

小伙伴们好啊&#xff0c;今天我们来学习vant。 介绍&#xff1a; 特性&#xff1a; 提供60多个高质量组件&#xff0c;覆盖移动端各类场景性能极佳&#xff0c;组件平均体积不到1kb单元测试覆盖率90%&#xff0c;提供稳定性保障完善的中英文文档和示例支持Vue2&Vue3支持…

华为设备telnet 远程访问配置实验简述

一、实验需求: 1、AR1模拟电脑telnet 访问AR2路由器。 二、实验步骤&#xff1a; 1、AR1和AR2接口配置IP&#xff0c;实现链路通信。 2、AR2配置AAA模式 配置用户及密码 配置用户访问级别 配置用户telnet 访问服务 AR2配置远程服务数量 配置用户远程访问模式为AAA 配置允许登录…

批量推送邮件如何高效实现?邮件推送技巧?

批量推送邮件有哪些注意事项&#xff1f;如何优化邮件推送效果&#xff1f; 无论是市场营销、客户服务还是内部沟通&#xff0c;批量推送邮件都发挥着关键作用。然而&#xff0c;如何高效实现批量推送邮件却是一个需要深思的问题。AokSend将探讨一些提高批量推送邮件效率的方法…

2005年上半年软件设计师【上午题】试题及答案

文章目录 2005年上半年软件设计师上午题--试题2005年上半年软件设计师上午题--答案2005年上半年软件设计师上午题–试题

stm32没有mmu,不能跑linux操作系统

stm32能跑linux操作系统吗&#xff1f; 答案&#xff1a;想要运行linux&#xff0c;芯片需要MMU&#xff0c;STM32没有MMU&#xff0c;所以不能运行Linux&#xff0c;WinCE等&#xff1b;但是可以运行ucosii、freertos、uLinux、vxWorks等。 根本原因&#xff1a;linux系统是…

【Sa-Token|4】Sa-Token微服务项目应用

若微服务数量多&#xff0c;如果每个服务都改动&#xff0c;工作量大&#xff0c;则可以只在网关和用户中心进行改动&#xff0c;也是可以实现单点登录的。 这种方式可以通过在网关服务中生成和验证 Sa-Token&#xff0c;并将其与现有的 Token关联存储在 Redis 中。用户中心提供…

自学鸿蒙HarmonyOS的ArkTS语言<三>路由跳转及传参

【官方文档传送门】 一、导入模块 import router from ohos.router二、新增页面配置 三、常用api 1、跳转到应用内的指定页面 build() {Row() {Button(下一页).onClick(() > {router.pushUrl({url: pages/Index2,params: {name: test}})})}.height(100%)}2、用应用内的某…

【Java】已解决java.net.UnknownHostException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.net.UnknownHostException异常 在Java的网络编程中&#xff0c;java.net.UnknownHostException是一个常见的异常&#xff0c;它通常表明在尝试解析主机名时出现了问题。…

php基础语法_面向对象

PHP php代码标记 多种标记来区分php脚本 ASP标记&#xff1a;<% php代码 %> 短标记&#xff1a; 脚本标记: 标准标记&#xff08;常用&#xff09;&#xff1a; 简写风格&#xff1a; ASP风格&#xff1a;<% php代码 %> 注意&#xff1a;简写风格和ASP风格…

myslql事务示例

在 MySQL 中&#xff0c;事务&#xff08;Transaction&#xff09;是一组要么全部执行&#xff0c;要么全部不执行的SQL语句。这可以确保数据的一致性和完整性。事务管理的核心包括四个属性&#xff0c;即原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consiste…

RegionClip环境安装踩坑指南

RegionClip环境安装 RegionClip环境安装)问题1问题2问题3问题4问题5 RegionClip环境安装) 特别强调&#xff0c;不要单独去安装detectron2&#xff0c;会出现model.clip不存在的错误&#xff0c;通过python -m pip install -e RegionCLIP就可以问题1 问题&#xff1a;torch-c…

安卓SDK发布到maven

【参考文档】 maven central:https://vanniktech.github.io/gradle-maven-publish-plugin/central/#in-memory-gpg-key 安装gpg&#xff1a; https://central.sonatype.org/publish/requirements/gpg/#publish-or-drop-the-deployment 【流程】 1、进入Maven Central: P…

sourceTree 解决remote: HTTP Basic: Access denied报错mac

解决sourceTree中remote: HTTP Basic: Access denied报错 mac sourcetree报错报错原因解决方案 mac sourcetree报错 warning: invalid credential line: xxx.com remote: HTTP Basic: Access denied fatal参考链接&#xff1a;https://developer.aliyun.com/article/1304149 …

在分数限制下,是选择好专业还是好学校取决于你个人的兴趣、职业规划和实际情况。

分数限制下&#xff0c;选好专业还是选好学校&#xff1f; 方向一&#xff1a;专业解析 选择专业与选择学校之间的决策确实是一个复杂的过程&#xff0c;涉及到个人兴趣、职业目标以及教育资源等多个因素。我来结合实际场景&#xff0c;探讨不同专业的优势、未来挑战以及专业与…

高效学习方法笔记

part1.学习方法: 1.知识多不等于学习能力强&#xff1b; 2.考试是最有效的学习策略&#xff1b; 3.间隔练习使知识存储更牢固&#xff1b; 4.自我检索&#xff08;反思&#xff09;能更好的掌握知识&#xff1b; 5.穿插练习有助于长期记忆&#xff1b; 6.多样性练习促进知识的…

ruoyi登录功能源码分析

Ruoyi登录功能源码分析 上一篇文章我们分析了一下若依登录验证码生成的代码&#xff0c;今天我们来分析一下登录功能的代码 1、发送登录请求 前端通过http://localhost/dev-api/login向后端发送登录请求并携带用户的登录表单 在后端中的com.ruoyi.web.controller.system包下…

mysql中使用json_arrayagg(),指定数组中元素排序

背景&#xff1a; 按照某个字段分组&#xff0c;分组后将同类型的元素聚合在一个数组中&#xff0c;最后再比较数组是否相等。 使用json_arrayagg()&#xff0c;数组中元素排序为数据所属表的默认排序&#xff0c;不满足比较数组是否相等的需求。 既然要排序&#xff0c;于是写…