首页 > 后端开发 > C++ > 正文

c++怎么序列化和反序列化一个对象_c++对象持久化与数据保存方案

下次还敢
发布: 2025-11-15 16:37:02
原创
341人浏览过
C++中实现序列化需手动设计或用第三方库,常用方法包括自定义读写函数、Boost.Serialization库和JSON格式。

c++怎么序列化和反序列化一个对象_c++对象持久化与数据保存方案

在C++中实现对象的序列化与反序列化(即对象持久化),由于语言本身没有内置机制,需要开发者自行设计或借助第三方库。核心目标是将对象的状态转换为可存储或传输的格式(如二进制、JSON、XML等),并在需要时还原成原始对象。

使用自定义序列化方法

对于简单的类,可以手动实现序列化逻辑。通过重载>>操作符,将对象写入输出流或从输入流读取。

例如,有一个Person类:

class Person {
    std::string name;
    int age;
public:
    void save(std::ostream& os) const {
        size_t name_len = name.size();
        os.write(reinterpret_cast(&name_len), sizeof(name_len));
        os.write(name.data(), name_len);
        os.write(reinterpret_cast(&age), sizeof(age));
    }

    void load(std::istream& is) {
        size_t name_len;
        is.read(reinterpret_cast(&name_len), sizeof(name_len));
        name.resize(name_len);
        is.read(&name[0], name_len);
        is.read(reinterpret_cast(&age), sizeof(age));
    } }

保存到文件:

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

{     std::ofstream ofs("person.dat", std::ios::binary);     person.save(ofs); }

恢复对象:

{     std::ifstream ifs("person.dat", std::ios::binary);     person.load(ifs); }

使用Boost.Serialization库

Boost提供了一套成熟的序列化方案,支持二进制、文本、XML等多种格式。

先包含头文件并声明序列化方法:

#include <boost/serialization/string.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

在类中添加serialize函数:

template<class Archive>
void serialize(Archive& ar, const unsigned int version) {
    ar &name, age;
}

保存对象:

{     std::ofstream ofs("person.txt");     boost::archive::text_oarchive oa(ofs);     oa

加载对象:

{     std::ifstream ifs("person.txt");     boost::archive::text_iarchive ia(ifs);     ia >> person; }

使用Boost的好处是自动处理复杂类型(如STL容器)、版本兼容性和跨平台问题。

使用JSON进行轻量级持久化

对于需要可读性或与其他系统交互的场景,JSON是不错选择。推荐使用nlohmann/json库。

序列猴子开放平台
序列猴子开放平台

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

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

示例:

#include <nlohmann/json.hpp>

向json转换:

nlohmann::json to_json() const {
    return nlohmann::json{{"name", name}, {"age", age}};
}

从json恢复:

static Person from_json(const nlohmann::json& j) {
    Person p;
    p.name = j.at("name");
    p.age = j.at("age");
    return p;
}

保存到文件:

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

{     auto j = person.to_json();     std::ofstream o("person.json");     o

读取:

{     std::ifstream i("person.json");     nlohmann::json j;     i >> j;     person = Person::from_json(j); }

注意事项与建议

涉及指针成员时,直接序列化可能导致问题,应避免裸指针或实现深度复制逻辑。

确保跨平台一致性:不同机器字节序、对齐方式可能影响二进制格式,必要时使用标准编码(如网络字节序)。

版本控制很重要:对象结构变更后,旧数据仍需能被正确解析,可在数据中加入版本号字段。

安全考虑:反序列化来自不可信源的数据存在风险,需做校验和边界检查。

基本上就这些。根据项目需求选择合适的方式——简单场景用手动序列化,复杂结构用Boost,需要可读性或Web交互则选JSON。

以上就是c++++怎么序列化和反序列化一个对象_c++对象持久化与数据保存方案的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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