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

c++如何将对象序列化_c++对象序列化与反序列化技术

冰火之心
发布: 2025-09-18 14:41:01
原创
211人浏览过
C++对象序列化方法包括手写函数、Boost.Serialization、JSON库(如nlohmann/json)和Protocol Buffers;选择依据性能、跨语言、开发效率等需求。

c++如何将对象序列化_c++对象序列化与反序列化技术

C++对象序列化,简单来说,就是把内存里的对象变成一串字节,方便存到文件里或者通过网络传输。反序列化就是反过来,把字节串变回对象。这俩操作在持久化数据、RPC(远程过程调用)啥的场景里特别有用。

把C++对象变成一串可以存储或传输的字节流,然后再变回来。

C++对象序列化有哪些方法?

其实方法挺多的,各有优缺点。

  1. 自己手写序列化/反序列化函数: 这是最原始的方法,给每个类都写

    serialize()
    登录后复制
    deserialize()
    登录后复制
    函数。优点是完全可控,性能也好优化,但缺点就是太麻烦了,尤其是类结构复杂的时候,简直是噩梦。

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

    class MyClass {
    public:
        int x;
        std::string s;
    
        void serialize(std::ostream& os) const {
            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) {
            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.data(), len);
        }
    };
    登录后复制

    这种方法需要自己处理字节对齐、大小端转换等问题。

  2. 使用第三方库,比如 Boost.Serialization: Boost 库功能强大,

    Boost.Serialization
    登录后复制
    提供了很方便的序列化/反序列化机制。它用宏来声明哪些成员需要序列化,用起来比较简单。但 Boost 库比较大,如果只是为了序列化,有点重量级。

    #include <boost/serialization/serialization.hpp>
    #include <boost/archive/text_oarchive.hpp>
    #include <boost/archive/text_iarchive.hpp>
    #include <fstream>
    
    class MyClass {
    public:
        int x;
        std::string s;
    
    private:
        friend class boost::serialization::access;
        template<class Archive>
        void serialize(Archive & ar, const unsigned int version)
        {
            ar & x;
            ar & s;
        }
    };
    
    int main() {
        MyClass obj{10, "hello"};
        std::ofstream ofs("data.txt");
        boost::archive::text_oarchive ar(ofs);
        ar & obj; // 序列化
    
        MyClass obj2;
        std::ifstream ifs("data.txt");
        boost::archive::text_iarchive iar(ifs);
        iar & obj2; // 反序列化
        return 0;
    }
    登录后复制

    Boost.Serialization 支持多种序列化格式,例如文本、二进制和 XML。

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

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

    序列猴子开放平台 0
    查看详情 序列猴子开放平台
  3. 使用 JSON 库,比如 nlohmann/json: 如果你的对象结构比较简单,或者需要和其他语言交互,用 JSON 序列化是个不错的选择。

    nlohmann/json
    登录后复制
    是一个非常流行的 C++ JSON 库,用起来也很方便。

    #include <nlohmann/json.hpp>
    #include <fstream>
    
    using json = nlohmann::json;
    
    class MyClass {
    public:
        int x;
        std::string s;
    
        json to_json() const {
            json j;
            j["x"] = x;
            j["s"] = s;
            return j;
        }
    
        void from_json(const json& j) {
            x = j["x"];
            s = j["s"];
        }
    };
    
    int main() {
        MyClass obj{10, "hello"};
        json j = obj.to_json();
        std::ofstream ofs("data.json");
        ofs << j.dump(4); // 序列化成 JSON 字符串
    
        MyClass obj2;
        std::ifstream ifs("data.json");
        json j2;
        ifs >> j2;
        obj2.from_json(j2); // 从 JSON 字符串反序列化
        return 0;
    }
    登录后复制

    这种方法可读性好,易于调试,但性能相对较低。

  4. Protocol Buffers (protobuf): 这是 Google 开发的一种数据序列化协议,特点是高效、跨语言。需要先定义

    .proto
    登录后复制
    文件,然后用 protobuf 编译器生成 C++ 代码。protobuf 在 RPC 场景下应用广泛。

    syntax = "proto3";
    
    message MyClass {
        int32 x = 1;
        string s = 2;
    }
    登录后复制

    然后用

    protoc
    登录后复制
    编译器生成 C++ 代码,使用生成的代码进行序列化和反序列化。

如何选择合适的序列化方法?

选择哪个方法,主要看你的需求。

  • 性能要求高: 手写或者 protobuf。
  • 开发效率优先: Boost.Serialization 或者 JSON。
  • 需要跨语言交互: JSON 或者 protobuf。
  • 对象结构复杂: Boost.Serialization 或者 protobuf。
  • 对象结构简单: JSON 或者手写。

序列化时需要注意哪些问题?

  1. 版本兼容性: 如果你的类结构会发生变化,序列化后的数据可能就不能被旧版本的代码反序列化。为了解决这个问题,可以引入版本号,在序列化/反序列化时进行版本判断。
  2. 指针和循环引用: 如果对象包含指针,需要小心处理指针指向的对象。如果存在循环引用,更要避免无限递归。Boost.Serialization 提供了处理指针和循环引用的机制。
  3. 安全性: 反序列化来自不可信来源的数据时,要小心安全问题。例如,恶意数据可能会导致缓冲区溢出或者执行任意代码。
  4. 字节序: 不同的机器可能使用不同的字节序(大端或小端)。在序列化/反序列化时,需要考虑字节序转换。
  5. 浮点数精度: 浮点数的序列化和反序列化可能会导致精度损失。

序列化和反序列化性能优化有哪些技巧?

  1. 选择合适的序列化格式: 二进制格式通常比文本格式更快。
  2. 减少数据拷贝: 尽量避免不必要的数据拷贝。例如,可以使用零拷贝技术。
  3. 使用缓存: 对于频繁访问的数据,可以使用缓存来提高性能。
  4. 并行化: 如果可以,可以使用多线程来并行化序列化和反序列化过程。
  5. 避免虚函数: 虚函数会增加序列化/反序列化的开销。

总而言之,C++ 对象序列化是个挺有意思的话题,选择合适的方法并注意一些细节,就能让你的程序更健壮、更高效。

以上就是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号