Protobuf在C++中实现高效序列化与反序列化,通过.proto文件定义数据结构并生成C++代码,使用SerializeToString或SerializeToOstream进行序列化,ParseFromString或ParseFromIstream完成反序列化,结合gRPC自动处理数据交换,具有高性能、类型安全和跨语言优势。

在C++中使用Protobuf进行序列化与反序列化,是实现高性能数据交换和构建gRPC服务的基础。Protobuf(Protocol Buffers)由Google开发,是一种语言中立、平台中立、可扩展的序列化结构化数据的方式,相比JSON或XML,它更小、更快、更简单。
要使用Protobuf,首先要编写一个.proto文件来定义数据结构。例如,创建一个person.proto文件:
syntax = "proto3";
message Person {
string name = 1;
int32 age = 2;
string email = 3;
}
保存后,使用Protobuf编译器protoc生成C++代码:
protoc --cpp_out=. person.proto
这会生成person.pb.h和person.pb.cc两个文件,供C++项目包含和链接。
序列化是将Protobuf对象转换为二进制字节流的过程,便于存储或网络传输。
示例代码:
#include "person.pb.h"
#include <fstream>
int main() {
Person person;
person.set_name("Alice");
person.set_age(30);
person.set_email("alice@example.com");
std::string buffer;
if (!person.SerializeToString(&buffer)) {
return -1; // 序列化失败
}
// 也可以写入文件
std::ofstream output("person.bin", std::ios::binary);
person.SerializeToOstream(&output);
output.close();
return 0;
}
关键点:
反序列化是将字节流还原为Protobuf对象的过程。
CA.LA
第一款时尚产品在线设计平台,服装设计系统
94
查看详情
示例代码:
#include "person.pb.h" #include <fstream> #include <iostr注意:eam> int main() { Person person; // 从文件读取 std::ifstream input("person.bin", std::ios::binary); if (!person.ParseFromIstream(&input)) { std::cerr << "Failed to parse person." << std::endl; return -1; } input.close(); // 或从字符串解析 // std::string buffer = ...; // person.ParseFromString(buffer); std::cout << "Name: " << person.name() << std::endl; std::cout << "Age: " << person.age() << std::endl; std::cout << "Email: " << person.email() << std::endl; return 0; }
在gRPC中,Protobuf不仅是数据交换格式,还用于定义服务接口。
扩展.proto文件以定义RPC服务:
service PersonService {
rpc GetPerson (PersonRequest) returns (Person);
rpc AddPerson (Person) returns (AddResponse);
}
gRPC插件会自动生成服务端和客户端的C++桩代码(stub),你只需实现具体逻辑。序列化与反序列化过程由gRPC框架自动完成,开发者直接操作Protobuf对象即可。
优势:基本上就这些。掌握Protobuf的序列化与反序列化,是使用C++构建高效通信系统和gRPC服务的第一步。不复杂但容易忽略细节,比如错误检查和编译流程配置。
以上就是C++怎么进行Protobuf序列化与反序列化_C++高性能数据交换与gRPC基础的详细内容,更多请关注其它相关文章!
相关文章:
Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问
Python多版本共存与虚拟环境管理深度指南
C++如何操作注册表_Windows平台下C++读写注册表的API函数详解
怎么去除衣服上的口红印_生活小妙招教你用酒精轻松擦除
Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧
J*aScript DOM操作:高效清空列表元素的策略与实践
如何在Python中使用Optional类型处理可变对象并避免Pylint警告
Python自定义类排序:解决lambda键值访问TypeError的实践指南
Golang如何实现简单的Web表单_Golang表单提交与验证处理方法
Spyder启动失败:字体文件权限拒绝错误解决方案
PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符
PHP字符串中复杂变量插值的最佳实践与语法解析
b站怎么删除评论_b站评论管理与删除操作
PHP表单提交消息延迟显示:Post-Redirect-Get模式深度解析与实践
在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析
Excel组合图表怎么做 Excel创建柱状图与折线组合图教程【图表】
解决PHP集成HTML后CSS和图片路径加载问题的指南
理解Python模块与全局变量的作用域管理
Lar*el Form Request 中唯一性验证更新操作的正确实践
excel怎么提取文本中数字 excel函数提取技巧
qq游戏免费畅玩入口_qq游戏电脑版快速启动
Go语言中动态执行代码字符串的策略与实践
支付宝如何管理隐私设置_支付宝隐私保护的配置技巧
Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】
Angular Material 垂直步进器:实现底部到顶部排序的教程
海棠电脑版入口_通过电脑访问海棠官网阅读
c++ 获取系统当前时间 c++时间戳获取方法
J*aScript数据结构转换:将对象数组按类别分组
微博网页版官方账号登录 微博网页版内容浏览使用指南
极速漫画官方主页网址 极速漫画漫画在线浏览官网链接
为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法
NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰
在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析
漫蛙漫画登录站点 漫蛙2正版漫画快速访问
Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区
邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策
Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑
如何在CSS中使用visited与link控制链接颜色_visited link伪类配合
2026春节假期时间安排 2026春节假日查询
J*aScript教程:根据元素文本内容动态设置背景色
Shopware订单中获取产品自定义字段的实用指南
AO3官方镜像站点汇总 AO3同人作品网页版直达链接
J*aScript 字符串标签转换:使用正则表达式高效替换
ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版
如何在网页中实现特定地点的随机图片展示
AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看
《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元
sublime怎么预览Markdown渲染效果_Markdown Preview插件 for sublime教程
现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践
MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具