news 2026/5/1 7:58:51

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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的更多细节 ^ ^

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 8:19:03

邻接矩阵练习1--------LCP 07.传递信息

前言 当我把手机的时间根据自己的起床时间调整以后&#xff0c;一切都变得奇妙起来了&#xff0c;我感觉这样真的蛮神圣的&#xff0c;先试试再说。 题目&#xff1a;点这里 解法 class Solution { public:int matrix[10][10];// memset(matrix,0,sizeof(matrix));int N;//…

作者头像 李华
网站建设 2026/4/26 15:23:53

网易云音乐插件管理工具:BetterNCM Installer使用指南

网易云音乐插件管理工具&#xff1a;BetterNCM Installer使用指南 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer BetterNCM Installer是一款专注于网易云音乐插件管理的免费工具&…

作者头像 李华
网站建设 2026/5/1 6:04:01

本地多人游戏神器Nucleus Co-Op:开启单机游戏新玩法

本地多人游戏神器Nucleus Co-Op&#xff1a;开启单机游戏新玩法 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 还在为想和朋友一起玩单机游戏却只…

作者头像 李华
网站建设 2026/5/1 7:22:55

KV Cache:让AI“秒回“的幕后功臣

KV Cache&#xff1a;让AI"秒回"的幕后功臣 开篇&#xff1a;为什么 AI 能这么快回复你&#xff1f; 你有没有好奇过&#xff0c;当你和 ChatGPT 聊天时&#xff0c;它为什么能这么快地回复你&#xff1f; 尤其是当你问了一个很长的问题&#xff0c;AI 不仅要理解你的…

作者头像 李华
网站建设 2026/4/19 14:36:31

工业电机驱动板PCB设计案例核心要点解析

以下是对您提供的技术博文进行 深度润色与结构重构后的专业级技术文章 。全文严格遵循您的所有要求&#xff1a; ✅ 彻底去除AI痕迹&#xff0c;语言自然、有“人味”&#xff0c;像一位资深硬件工程师在分享实战心得&#xff1b; ✅ 打破模板化标题体系&#xff0c;用逻辑…

作者头像 李华
网站建设 2026/5/1 1:35:00

跨平台字体解决方案:思源黑体TTF多场景应用探索指南

跨平台字体解决方案&#xff1a;思源黑体TTF多场景应用探索指南 【免费下载链接】source-han-sans-ttf A (hinted!) version of Source Han Sans 项目地址: https://gitcode.com/gh_mirrors/so/source-han-sans-ttf 你是否曾遇到在不同设备上中文字体显示效果参差不齐的…

作者头像 李华