值得一看
广告
彩虹云商城
广告

热门广告位

C++如何将数据序列化和反序列化_C++ 数据序列化方法

C++中序列化常用JSON、二进制、Protobuf或自定义方法;JSON易读适合配置,用nlohmann/json库实现对象与JSON互转;二进制高效但限POD类型且需处理字节序;Protobuf跨语言高性能,需定义.proto文件生成代码;自定义接口灵活但需手动管理字段读写与内存。

c++如何将数据序列化和反序列化_c++ 数据序列化方法

在C++中实现数据的序列化和反序列化,通常需要将对象转换为字节流以便存储或传输,然后再还原为原始对象。由于C++标准库没有内置的序列化机制,开发者需借助自定义方法或其他工具来完成。

使用JSON进行序列化与反序列化

JSON是一种轻量、易读的数据交换格式,适合配置文件或网络通信。通过第三方库如 nlohmann/json 可以轻松实现C++对象与JSON之间的转换。

示例代码:

#include <iostream>
#include <nlohmann/json.hpp>
struct Person {
std::string name;
int age;
};
// 序列化
void to_json(nlohmann::json& j, const Person& p) {
j = nlohmann::json{{"name", p.name}, {"age", p.age}};
}
// 反序列化
void from_json(const nlohmann::json& j, Person& p) {
j.at("name").get_to(p.name);
j.at("age").get_to(p.age);
}
int main() {
Person p{"Alice", 30};
// 转为JSON字符串
nlohmann::json j = p;
std::string json_str = j.dump();
std::cout << json_str << std::endl;
// 从JSON恢复对象
auto p2 = j.get<Person>();
std::cout << p2.name << ", " << p2.age << std::endl;
return 0;
}

使用二进制方式进行高效序列化

对于性能要求高的场景,可采用二进制方式直接写入内存数据。适用于POD(Plain Old Data)类型。

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

说明:该方法不支持复杂结构(如指针、STL容器),且跨平台时需注意字节序问题。

示例:

#include <fstream>
#include <iostream>
struct Data {
int id;
double value;
};
// 写入二进制文件(序列化)
void save_binary(const Data& d, const std::string& filename) {
std::ofstream out(filename, std::ios::binary);
out.write(reinterpret_cast<const char*>(&d), sizeof(Data));
}
// 读取二进制文件(反序列化)
void load_binary(Data& d, const std::string& filename) {
std::ifstream in(filename, std::ios::binary);
in.read(reinterpret_cast<char*>(&d), sizeof(Data));
}
int main() {
Data d{1, 3.14};
save_binary(d, "data.bin");
Data loaded{};
load_binary(loaded, "data.bin");
std::cout << "ID: " << loaded.id << ", Value: " << loaded.value << std::endl;
return 0;
}

使用Google Protocol Buffers(Protobuf)

Protobuf是Google开发的高效、跨语言的序列化方案。需定义 .proto 文件并生成C++代码。

序列猴子开放平台

序列猴子开放平台

具有长序列、多模态、单模型、大数据等特点的超大规模语言模型

序列猴子开放平台0

查看详情
序列猴子开放平台

步骤:

  • 编写 .proto 文件描述数据结构
  • 使用 protoc 编译器生成 C++ 类
  • 调用 SerializeToString / ParseFromString 方法

.proto 示例:

syntax = "proto3";
message Person {
string name = 1;
int32 age = 2;
}

C++ 使用:

Person person;
person.set_name("Bob");
person.set_age(25);
std::string buffer;
person.SerializeToString(&buffer);  // 序列化
Person recovered;
recovered.ParseFromString(buffer);  // 反序列化

自定义序列化接口

对复杂类,可以设计统一的序列化接口,手动控制字段读写。

例如:

class Serializable {
public:
virtual void serialize(std::ostream& os) const = 0;
virtual void deserialize(std::istream& is) = 0;
};
struct MyData : Serializable {
int x;
std::string s;
void serialize(std::ostream& os) const override {
os.write(reinterpret_cast<const char*>(&x), sizeof(x));
size_t len = s.size();
os.write(reinterpret_cast<const char*>(&len), sizeof(len));
os.write(s.data(), len);
}
void deserialize(std::istream& is) override {
is.read(reinterpret_cast<char*>(&x), sizeof(x));
size_t len;
is.read(reinterpret_cast<char*>(&len), sizeof(len));
s.resize(len);
is.read(&s[0], len);
}
};

基本上就这些。选择哪种方法取决于你的需求:调试友好选JSON,性能优先考虑二进制或Protobuf,跨平台兼容性要求高推荐Protobuf。自定义方式灵活但需小心管理内存和格式一致性。

相关标签:

js json go 字节 工具 ai c++ ios stream google 配置文件 标准库 red json 指针 数据结构 接口 对象
温馨提示: 本文最后更新于2025-10-03 22:28:20,某些文章具有时效性,若有错误或已失效,请在下方留言或联系在线客服
文章版权声明 1 本网站名称: 创客网
2 本站永久网址:https://new.ie310.com
1 本文采用非商业性使用-相同方式共享 4.0 国际许可协议[CC BY-NC-SA]进行授权
2 本站所有内容仅供参考,分享出来是为了可以给大家提供新的思路。
3 互联网转载资源会有一些其他联系方式,请大家不要盲目相信,被骗本站概不负责!
4 本网站只做项目揭秘,无法一对一教学指导,每篇文章内都含项目全套的教程讲解,请仔细阅读。
5 本站分享的所有平台仅供展示,本站不对平台真实性负责,站长建议大家自己根据项目关键词自己选择平台。
6 因为文章发布时间和您阅读文章时间存在时间差,所以有些项目红利期可能已经过了,能不能赚钱需要自己判断。
7 本网站仅做资源分享,不做任何收益保障,创业公司上收费几百上千的项目我免费分享出来的,希望大家可以认真学习。
8 本站所有资料均来自互联网公开分享,并不代表本站立场,如不慎侵犯到您的版权利益,请联系79283999@qq.com删除。

本站资料仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END
喜欢就支持一下吧
点赞10赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容