新闻中心

C++怎么使用protobuf进行数据序列化_C++数据交换与protobuf应用

2025-11-12
浏览次数:
返回列表
首先定义.proto文件描述数据结构,再用protoc生成C++代码,接着在程序中包含头文件并调用SerializeToOstream和ParseFromIstream进行序列化与反序列化,最后链接protobuf库完成构建。

c++怎么使用protobuf进行数据序列化_c++数据交换与protobuf应用

在C++项目中使用Protocol Buffers(简称protobuf)进行数据序列化,是实现高效、跨平台数据交换的常用方式。它比JSON或XML更紧凑,解析更快,适合网络传输和持久化存储。下面介绍如何在C++中集成并使用protobuf完成序列化与反序列化操作。

定义.proto协议文件

使用protobuf的第一步是定义数据结构的.proto文件。这个文件描述了你要序列化的消息格式。

例如,创建一个person.proto文件:

syntax = "proto3";

message Person {
  string name = 1;
  int32 age = 2;
  string email = 3;
}

这段代码定义了一个名为Person的消息类型,包含姓名、年龄和邮箱字段。每个字段都有唯一的编号,用于二进制编码。

生成C++代码

使用protoc编译器将.proto文件编译为C++头文件和源文件。

执行以下命令:

protoc --cpp_out=. person.proto

这会生成两个文件:person.pb.hperson.pb.cc。它们包含了Person类的C++实现,提供了序列化、反序列化和访问字段的方法。

在C++中序列化与反序列化

包含生成的头文件后,就可以创建对象并进行序列化操作。

千鹿Pr助手 千鹿Pr助手

智能Pr插件,融入众多AI功能和海量素材

千鹿Pr助手 128 查看详情 千鹿Pr助手

序列化示例:

#include "person.pb.h"
#include <fstream>

int main() {
  Person person;
  person.set_name("张三");
  person.set_age(25);
  person.set_email("zhangsan@example.com");

  std::ofstream output("person.bin", std::ios::binary);
  person.SerializeToOstream(&output);
  output.close();

  return 0;
}

反序列化示例:

#include "person.pb.h"
#include <fstream>
#include <iostream>

int main() {
  Person person;
  std::ifstream input("person.bin", std::ios::binary);
  person.ParseFromIstream(&input);
  input.close();

  std::cout << "Name: " << person.name() << "\n";
  std::cout << "Age: " << person.age() << "\n";
  std::cout << "Email: " << person.email() << "\n";

  return 0;
}

上述代码展示了如何将对象写入二进制文件,以及从文件读取并恢复对象状态。

构建与链接protobuf库

编译时需要链接protobuf库。假设你已安装libprotobuf,使用g++编译:

g++ -o serialize main.cpp person.pb.cc `pkg-config --cflags --libs protobuf`

Windows上若使用CMake,需配置find_package(Protobuf REQUIRED)并链接protobuf::libprotobuf目标。

确保运行环境中有对应的动态库,或静态链接避免依赖问题。

基本上就这些。只要定义好协议,生成代码,调用API即可完成高效的数据交换。不复杂但容易忽略细节,比如字段编号不能重复、默认值处理、版本兼容性等。保持.proto文件演进时的向后兼容,是长期维护的关键。

以上就是C++怎么使用protobuf进行数据序列化_C++数据交换与protobuf应用的详细内容,更多请关注其它相关文章!


# 工厂网站怎么优化软件  # 化与  # 头文件  # 尼克  # 多线程  # 如何用  # 文本文件  # 松溪营销推广招聘信息  # 芦苞seo教程  # 如何实现  # 代金券的推广和营销的区别  # seo专栏视频教学  # 北京seo实训班学校  # 安徽网站推广优化哪个好  # 品牌网站建设必备内容  # 正规seo平台排名前十  # 临沂靠谱seo方案  # c++  # 数据交换  # 数据结构  # 序列化  # r  # 持久化存储  # 邮箱  # stream  # win  # ios  # ai  # 编码  # windows  # json  # js  # protobuf 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】  NetBeans Ant项目:自动化将资源文件复制到dist目录的教程  《燕云十六声》两周内达九百万玩家!位居畅销榜第五  一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰  12306怎么选座位选到安静区_12306选座安静区域选择策略  飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】  深入理解J*aScript Promise异步执行与微任务队列  C++指针和引用有什么区别_C++内存管理核心概念深度解析  composer的"require-dev"部分是用来做什么的?  Win11怎么关闭触摸屏_Windows 11禁用HID符合标准触摸屏  QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道  XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法  LINUX下如何进行磁盘分区_fdisk与parted工具在LINUX中的使用对比  蛙漫移动版在线看 蛙漫手机浏览器直达入口  iwriter统一登录平台 iwrite账号密码登录页面  高德地图公交到站提醒失败如何解决 高德提醒权限设置  如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置  企业名称高精度匹配:N-gram方法在结构相似性分析中的应用  在哪找SublimeJ远程工具_SFTP插件配置教程  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  解决 Express.js 中 PUT 请求密码修改失败的路由配置指南  腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址  TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法  如何将HTML表格多行数据保存到Google Sheet  天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南  Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】  C++如何实现单例模式_C++设计模式之线程安全的单例写法  微博网页版直接访问 微博网页版账号管理快速入口  今日头条怎么同步内容到抖音_今日头条内容同步到抖音教程  移动端XML文件怎么转换成Excel 手机和平板上的解决方案  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  mc.js官网登录入口 mc.js官方登录入口最新版  漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址  2026年CSGO开箱网站推荐 CSGO开箱平台精选  解决Python logging 中 datefmt 导致时间戳固定不变的问题  Go语言中的*string:深入理解字符串指针  海量存储:机器视觉智能化的核心基石  Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接  精准捕获:如何在页面中监听除特定元素外的所有点击事件  Typer应用中灵活处理命令行参数的令牌化与解析  如何使用纯J*aScript判断Input元素是否在特定类容器内  c++ 命名空间怎么用 c++ namespace使用指南  AO3最新镜像入口 Archive of Our Own官方平台访问  如何在J*a中使用Locale处理多语言环境  小红书怎么解除第三方平台绑定_小红书多平台登录解绑方法介绍  拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达  Angular中单选按钮的正确使用与常见陷阱解析  Golang如何实现容器化日志收集与分析_Golang容器日志收集分析方法  使用Pandas转换并合并DataFrame:多列映射至统一结构  J*aScript中如何高效提取对象指定属性 

搜索