0

0

C++如何进行数据序列化_使用Google Protobuf高效序列化C++对象

下次还敢

下次还敢

发布时间:2025-12-03 15:42:07

|

888人浏览过

|

来源于php中文网

原创

Protobuf是Google开发的高效二进制序列化工具,通过定义.proto文件描述数据结构,使用protoc编译生成C++类,实现快速序列化与反序列化;相比JSON/XML更小更快,适用于高性能通信、跨语言数据交换等场景。

c++如何进行数据序列化_使用google protobuf高效序列化c++对象

在C++开发中,当需要将对象保存到文件、通过网络传输或跨进程通信时,数据序列化是必不可少的环节。Google Protobuf(Protocol Buffers)是一个高效、跨平台、语言中立的序列化框架,特别适合用于C++项目中的结构化数据存储与通信。

什么是Protobuf?

Protobuf 是 Google 开发的一种二进制序列化格式,它通过预定义的 .proto 文件描述数据结构,然后由编译器生成对应语言的代码(如 C++ 类),实现对象到字节流的快速转换。相比 JSON 或 XML,Protobuf 更小、更快、更简单。

使用步骤详解

要在 C++ 中使用 Protobuf 进行序列化,需完成以下几个步骤:

1. 定义 .proto 文件

首先编写一个 .proto 文件来描述你要序列化的数据结构。例如,定义一个 Person 消息类型:

立即学习C++免费学习笔记(深入)”;

syntax = "proto3";
package example;

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

上述定义说明:Person 包含三个字段,每个字段都有唯一的编号(用于二进制编码)。

2. 编译 .proto 文件生成 C++ 代码

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

protoc --cpp_out=. person.proto

执行后会生成 person.pb.hperson.pb.cc 两个文件,其中包含可直接使用的 C++ 类。

改图鸭AI图片生成
改图鸭AI图片生成

改图鸭AI图片生成

下载

3. 在 C++ 项目中使用生成的类

包含头文件并使用 Protobuf 提供的 API 进行序列化和反序列化操作:

#include "person.pb.h"
#include stream>
#include iostream>

序列化示例:

example::Person person;
person.set_name("Alice");
person.set_age(30);
person.set_email("alice@example.com");

// 序列化到文件
std::ofstream output("person.bin", std::ios::binary);
person.SerializeToOstream(&output);
output.close();

反序列化示例:

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

std::cout

4. 链接 Protobuf 库

编译时需链接 Protobuf 的库文件。假设使用 g++ 和 pkg-config:

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

确保系统已安装 libprotobuf-dev 和 protoc 编译器。

优势与适用场景

  • 性能高:二进制格式体积小,序列化/反序列化速度快
  • 跨语言支持:一套 .proto 文件可生成多种语言代码
  • 版本兼容性好:支持字段增删而不破坏旧数据解析
  • 类型安全:编译期检查字段访问,减少运行时错误

适用于高性能服务间通信(如 gRPC)、配置文件存储、游戏状态保存等场景。

注意事项

  • 字段编号不可重复,删除字段建议保留注释并标记为 reserved
  • 默认字段不序列化以节省空间,读取缺失字段会返回默认值
  • 频繁创建/销毁消息对象时注意内存管理,可配合 Arena 使用优化性能

基本上就这些。用好 Protobuf 能显著提升 C++ 程序的数据交换效率,尤其在分布式或嵌入式环境中优势明显。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

325

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

232

2023.10.07

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

412

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

533

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

310

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

318

2023.08.02

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1881

2024.04.01

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

2

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7万人学习

C 教程
C 教程

共75课时 | 4.1万人学习

C++教程
C++教程

共115课时 | 12.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号