linux

Linux环境下C++如何进行序列化

小樊
50
2025-11-11 09:45:13
栏目: 编程语言

在Linux环境下,C++可以通过多种方式实现序列化。以下是一些常用的方法:

1. 使用Boost.Serialization

Boost.Serialization是一个功能强大的库,可以轻松地序列化和反序列化C++对象。

安装Boost.Serialization

首先,确保你已经安装了Boost库。如果没有安装,可以使用包管理器进行安装:

sudo apt-get install libboost-all-dev

示例代码

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

class Person {
public:
    std::string name;
    int age;

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

int main() {
    Person p1;
    p1.name = "John Doe";
    p1.age = 30;

    // 序列化到文件
    {
        std::ofstream ofs("person.txt");
        boost::archive::text_oarchive oa(ofs);
        oa << p1;
    }

    // 从文件反序列化
    Person p2;
    {
        std::ifstream ifs("person.txt");
        boost::archive::text_iarchive ia(ifs);
        ia >> p2;
    }

    std::cout << "Name: " << p2.name << ", Age: " << p2.age << std::endl;

    return 0;
}

2. 使用Cereal

Cereal是一个轻量级的C++序列化库,易于使用且性能良好。

安装Cereal

你可以从GitHub上下载Cereal库并进行编译安装,或者使用包管理器(如果可用):

sudo apt-get install libcereal-dev

示例代码

#include <cereal/archives/json.hpp>
#include <cereal/types/string.hpp>
#include <fstream>
#include <iostream>
#include <string>

class Person {
public:
    std::string name;
    int age;

    template<class Archive>
    void serialize(Archive &archive) {
        archive(name, age);
    }
};

int main() {
    Person p1;
    p1.name = "John Doe";
    p1.age = 30;

    // 序列化到文件
    {
        std::ofstream ofs("person.json");
        cereal::JSONOutputArchive oarchive(ofs);
        oarchive(cereal::make_nvp("Person", p1));
    }

    // 从文件反序列化
    Person p2;
    {
        std::ifstream ifs("person.json");
        cereal::JSONInputArchive iarchive(ifs);
        iarchive(cereal::make_nvp("Person", p2));
    }

    std::cout << "Name: " << p2.name << ", Age: " << p2.age << std::endl;

    return 0;
}

3. 使用标准库中的std::ofstreamstd::ifstream

虽然这种方法不如Boost.Serialization或Cereal强大,但它是最简单的方法之一。

示例代码

#include <fstream>
#include <iostream>
#include <string>

class Person {
public:
    std::string name;
    int age;

    void serialize(const std::string& filename) const {
        std::ofstream ofs(filename, std::ios::binary);
        ofs.write(reinterpret_cast<const char*>(&name), sizeof(name));
        ofs.write(reinterpret_cast<const char*>(&age), sizeof(age));
    }

    void deserialize(const std::string& filename) {
        std::ifstream ifs(filename, std::ios::binary);
        ifs.read(reinterpret_cast<char*>(&name), sizeof(name));
        ifs.read(reinterpret_cast<char*>(&age), sizeof(age));
    }
};

int main() {
    Person p1;
    p1.name = "John Doe";
    p1.age = 30;

    // 序列化到文件
    p1.serialize("person.bin");

    // 从文件反序列化
    Person p2;
    p2.deserialize("person.bin");

    std::cout << "Name: " << p2.name << ", Age: " << p2.age << std::endl;

    return 0;
}

总结

根据你的具体需求和偏好选择合适的方法。

0
看了该问题的人还看了