Protobuf C++ 快速上手:从 `.proto` 到序列化完整跑通

在前面的学习里,我已经多次接触“序列化”这个概念。
之前一直用 JSON,但很快会遇到两个问题:

  • 文本体积大,传输效率低
  • 解析性能一般

因此接下来需要学习Protocol Buffers(Protobuf),它是 Google 提供的一种高效二进制序列化协议,也是后续 brpc 的基础组件。

这一篇不讲复杂语法,只做一件事:

用 C++ 跑通 Protobuf 最小闭环:
定义结构 → 生成代码 → 序列化 → 反序列化

先把“能用”跑起来,再谈语法细节。


一、什么是序列化(结合我的理解)

在网络传输或持久化存储中:

  • 序列化:把内存中的对象 → 转换成二进制数据
  • 反序列化:把二进制数据→ 还原成对象

以前如果自己写类:

classPerson{string name;intage;// 还要自己写 encode() / decode()}

需要手动实现一堆get/set和序列化逻辑,繁琐且容易出错。

Protobuf 的核心思想就是:

我只需要写结构描述文件.proto
编译器自动生成 C++ 类 + 序列化 / 反序列化方法

这就是它高效的关键。


二、编写.proto文件

创建contacts.proto

syntax = "proto3"; package contacts; message PeopleInfo { string name = 1; // 字段编号标识 int32 age = 2; }

我目前理解的几个点

  • package类似 C++ 命名空间
  • message就是结构体 / 类
  • = 1, =2字段编号,用于二进制编码标识字段
  • Protobuf 最终序列化生成的是紧凑二进制数据,不是文本

这一步只是描述结构,真正的 C++ 类还没生成。


三、通过 protoc 生成 C++ 代码

执行命令:

protoc --cpp_out=. contacts.proto

会生成两个文件:

contacts.pb.h contacts.pb.cc

它们就是:

  • 自动生成的 C++ 类定义
  • 自动生成的序列化 / 反序列化实现

从这一刻起,我们不需要自己写任何 encode/decode 代码。

这也是 Protobuf 的关键特性:

依赖 .proto → 生成头文件和源文件 → 直接使用生成类


四、编写测试程序

下面是我跑通的完整测试代码。

main.cc

#include<iostream>#include"contacts.pb.h"intmain(){std::string person_str;// 构造对象并序列化contacts::PeopleInfo person;person.set_name("Alice");person.set_age(20);if(!person.SerializeToString(&person_str)){std::cerr<<"Failed to serialize person."<<std::endl;return-1;}std::cout<<"Serialized PeopleInfo: "<<person_str<<std::endl;// 反序列化contacts::PeopleInfo deserialized_person;if(!deserialized_person.ParseFromString(person_str)){std::cerr<<"Failed to deserialize person."<<std::endl;return-1;}std::cout<<"Deserialized PeopleInfo: name="<<deserialized_person.name()<<", age="<<deserialized_person.age()<<std::endl;return0;}

这里的重点是:

  • SerializeToString()→ 把对象序列化成二进制字符串
  • ParseFromString()→ 把二进制数据还原成对象

整个过程我没有写任何序列化逻辑,全部由生成代码完成


五、编译运行

编译命令:

g++ -o main main.cc contacts.pb.cc -std=c++11 -lprotobuf

运行后输出:

可以看到:

  • 控制台打印的序列化结果是不可读的二进制数据
  • 但反序列化后对象完整还原

说明整个 Protobuf 工作链路已经跑通。


六、小结

到这里,一个最小 Protobuf C++ 闭环已经完成:

流程总结:

.proto 描述结构 ↓ protoc 生成 .pb.h / .pb.cc ↓ 程序中直接使用生成类 ↓ SerializeToString → 二进制数据 ↓ ParseFromString → 还原对象

关键理解点:

  • Protobuf 的序列化结果是紧凑二进制数据
  • 不需要手写任何序列化逻辑
  • 一切依赖.proto生成的 C++ 源文件

这篇目的是为了让大家快速上手
接下来我会继续分享PB的更多细节 ^ ^

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

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

相关文章

如何突破硬件限制?开源串流工具让跨设备游戏体验升级

如何突破硬件限制&#xff1f;开源串流工具让跨设备游戏体验升级 【免费下载链接】Sunshine Sunshine: Sunshine是一个自托管的游戏流媒体服务器&#xff0c;支持通过Moonlight在各种设备上进行低延迟的游戏串流。 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshin…

为什么fft npainting lama总失败?常见问题排查指南

为什么FFT NPainting LaMa总失败&#xff1f;常见问题排查指南 你是不是也遇到过这样的情况&#xff1a;明明按照教程一步步操作&#xff0c;上传图片、画好修复区域、点击“开始修复”&#xff0c;结果等了半天&#xff0c;要么页面卡住不动&#xff0c;要么弹出报错&#xf…

一站式音乐聚合:告别平台割据的开源音乐解决方案

一站式音乐聚合&#xff1a;告别平台割据的开源音乐解决方案 【免费下载链接】listen1 集成多个在线音乐资源的网页版音乐播放器 项目地址: https://gitcode.com/gh_mirrors/lis/listen1 在数字音乐时代&#xff0c;你是否也曾为切换多个音乐平台寻找心仪歌曲而烦恼&…

三极管开关电路解析项目应用:简易光控开关设计

以下是对您提供的博文《三极管开关电路解析&#xff1a;简易光控开关的设计原理与工程实现》的 深度润色与专业重构版本 。本次优化严格遵循您的全部要求&#xff1a; ✅ 彻底去除AI痕迹&#xff0c;语言自然如资深工程师现场讲解 ✅ 摒弃“引言/概述/总结”等模板化结构&a…

重新定义SQLite查看:0成本3步实现浏览器端数据库管理

重新定义SQLite查看&#xff1a;0成本3步实现浏览器端数据库管理 【免费下载链接】sqlite-viewer View SQLite file online 项目地址: https://gitcode.com/gh_mirrors/sq/sqlite-viewer 如何在不安装软件的情况下安全查看数据库文件&#xff1f; 每个开发者都曾遇到这…

7步攻克游戏手柄冲突:设备优先级控制让玩家彻底掌控多控制器协同

7步攻克游戏手柄冲突&#xff1a;设备优先级控制让玩家彻底掌控多控制器协同 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 一、问题诊断&#xff1a;精准定位控制器冲突根源 当你发现手…

SMUDebugTool:AMD Ryzen硬件调试技术解析与应用指南

SMUDebugTool&#xff1a;AMD Ryzen硬件调试技术解析与应用指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitc…

一分钟学会:用CAM++验证家人语音是否一致的方法

一分钟学会&#xff1a;用CAM验证家人语音是否一致的方法 你有没有遇到过这种情况&#xff1a;家里老人接到一个“银行客服”电话&#xff0c;对方说要核实身份&#xff0c;然后让你爸念一段话&#xff0c;再让妈也念一遍……挂了电话后你突然一愣&#xff1a;这真的是银行在验…

探索SMUDebugTool:解锁AMD Ryzen系统调试潜能的实践指南

探索SMUDebugTool&#xff1a;解锁AMD Ryzen系统调试潜能的实践指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://…

Qwen-Image-2512部署效率低?多卡并行推理优化实战提升300%

Qwen-Image-2512部署效率低&#xff1f;多卡并行推理优化实战提升300% 1. 问题真实存在&#xff1a;单卡跑Qwen-Image-2512&#xff0c;出图慢得让人焦虑 你是不是也遇到过这种情况&#xff1a; 刚部署好Qwen-Image-2512-ComfyUI镜像&#xff0c;满怀期待点下“生成”&#x…

实战应用指南:如何用PyTorch-2.x-Universal-Dev-v1.0镜像快速实现图像分类项目

实战应用指南&#xff1a;如何用PyTorch-2.x-Universal-Dev-v1.0镜像快速实现图像分类项目 1. 为什么这个镜像能让你少走三天弯路 你有没有经历过这样的场景&#xff1a;花一整天配环境&#xff0c;结果卡在CUDA版本不匹配上&#xff1b;好不容易装好PyTorch&#xff0c;又发…

3个维度解决游戏日常任务负担的游戏自动化工具

3个维度解决游戏日常任务负担的游戏自动化工具 【免费下载链接】M9A 重返未来&#xff1a;1999 小助手 项目地址: https://gitcode.com/gh_mirrors/m9a/M9A M9A作为一款基于图像识别技术的游戏自动化工具&#xff0c;通过智能操作实现游戏日常任务的自动执行&#xff0c…

开源字体专业使用指南:从基础到实战的全面掌握

开源字体专业使用指南&#xff1a;从基础到实战的全面掌握 【免费下载链接】source-han-sans-ttf A (hinted!) version of Source Han Sans 项目地址: https://gitcode.com/gh_mirrors/so/source-han-sans-ttf 在数字化设计与开发领域&#xff0c;开源字体凭借其免费可商…

Sunshine完全指南:从设备限制到跨屏游戏的5个突破

Sunshine完全指南&#xff1a;从设备限制到跨屏游戏的5个突破 【免费下载链接】Sunshine Sunshine: Sunshine是一个自托管的游戏流媒体服务器&#xff0c;支持通过Moonlight在各种设备上进行低延迟的游戏串流。 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine …

如何验证GPEN部署成功?默认测试图运行步骤详解

如何验证GPEN部署成功&#xff1f;默认测试图运行步骤详解 你刚拉取了GPEN人像修复增强模型镜像&#xff0c;但不确定是否真的跑起来了&#xff1f;别急&#xff0c;这不是在猜谜——验证部署是否成功&#xff0c;其实只需要三步&#xff1a;进环境、跑命令、看结果。本文不讲…

车载语音交互测试:SenseVoiceSmall多场景识别部署实测

车载语音交互测试&#xff1a;SenseVoiceSmall多场景识别部署实测 1. 为什么车载语音需要“听懂情绪”和“听清环境” 你有没有遇到过这样的情况&#xff1a;开车时对语音助手说“我好累”&#xff0c;它却只机械地回一句“已为您播放轻音乐”&#xff1f;或者副驾朋友突然鼓…

智能游戏助手:如何让AI成为你的《重返未来:1999》策略军师?

智能游戏助手&#xff1a;如何让AI成为你的《重返未来&#xff1a;1999》策略军师&#xff1f; 【免费下载链接】M9A 重返未来&#xff1a;1999 小助手 项目地址: https://gitcode.com/gh_mirrors/m9a/M9A 技术原理&#xff1a;认知增强引擎如何重塑游戏体验&#xff1f…

从混乱到有序:RimSort智能管理模组的完整指南

从混乱到有序&#xff1a;RimSort智能管理模组的完整指南 【免费下载链接】RimSort 项目地址: https://gitcode.com/gh_mirrors/ri/RimSort 在复杂的模组生态系统中&#xff0c;你是否曾因依赖关系混乱而导致程序崩溃&#xff1f;面对成百上千个模组的加载顺序调整&…

Z-Image-Turbo实战:一句话生成赛博朋克夜景

Z-Image-Turbo实战&#xff1a;一句话生成赛博朋克夜景 在AI绘画工具层出不穷的今天&#xff0c;真正能让人“眼前一亮又立刻上手”的模型并不多。你可能试过等30秒生成一张图&#xff0c;结果细节糊成一片&#xff1b;也可能被复杂的参数、英文提示词、显存报错反复劝退。而Z…

一分钟上手Qwen-Image-Edit-2511,AI绘画从此不再难

一分钟上手Qwen-Image-Edit-2511&#xff0c;AI绘画从此不再难 你是否试过花半小时调参数、反复重绘&#xff0c;只为把一张商品图的背景换成纯白&#xff1f;是否在修图时纠结“换衣服”和“换姿势”哪个更自然&#xff1f;又或者&#xff0c;明明描述得很清楚&#xff0c;AI…