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

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

裘德小鎮的故事
发布: 2025-10-03 21:05:02
原创
255人浏览过
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++代码。

豆绘AI
豆绘AI

豆绘AI是国内领先的AI绘图与设计平台,支持照片、设计、绘画的一键生成。

豆绘AI 485
查看详情 豆绘AI

步骤:

  • 编写 .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。自定义方式灵活但需小心管理内存和格式一致性。

以上就是C++如何将数据序列化和反序列化_C++ 数据序列化方法的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源: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号