C++ 序列化反序列化

首先我们需要一个开源库 —— Cereal。
Cereal 的 GitHub 地址

具体怎么配置就不说了,就是一堆头文件 😃 ,拖到项目里就行。

// Test_Console_3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <Windows.h>
#include <cereal/types/memory.hpp>
#include <cereal/archives/binary.hpp>
#include <cereal/archives/xml.hpp>
#include <cereal/archives/json.hpp>
#include <fstream>

using namespace std;

// 测试类
class A {
public:
    int value1;
    string value2;
    float value3;
    double value4;
    char value5[20];

    // 构造函数
    A(int v1,string v2,float v3,double v4,string v5) {;
        value1 = v1;
        value2 = v2;
        value3 = v3;
        value4 = v4;
        strcpy(value5, v5.c_str());
    }
    A(){
        value1 = 0;
        value2 = "";
        value3 = 0;
        value4 = 0;
        strcpy(value5, "");
    }

    // 指定哪些成员被序列化
    template<class Archive>
    void serialize(Archive& archive)
    {
        archive(value1, value2, value3, value4, value5);
    }
};

int main()
{
    // “{}” 的作用是刷新内存,否则序列化后必须要等到进程关闭才能将内容写入文件

    // XML 序列化
    {
        std::ofstream os_xml("my.xml");
        cereal::XMLOutputArchive archive_xml_1(os_xml);
        A a_xml_1(1, "2", 3, 4, "5");
        archive_xml_1(
            cereal::make_nvp("a_xml.v1", a_xml_1.value1),
            cereal::make_nvp("a_xml.v2", a_xml_1.value2),
            cereal::make_nvp("a_xml.v3", a_xml_1.value3),
            cereal::make_nvp("a_xml.v4", a_xml_1.value4),
            cereal::make_nvp("a_xml.v5", a_xml_1.value5)
        );
    }

    // XML 反序列化
    {
        std::ifstream is_xml("my.xml");
        cereal::XMLInputArchive archive_xml_2(is_xml);
        A a_xml_2;
        archive_xml_2(a_xml_2.value1, a_xml_2.value2, a_xml_2.value3, a_xml_2.value4, a_xml_2.value5);
        cout << "a_xml.value1 = " << a_xml_2.value1 << "n"
            << "a_xml.value2 = " << a_xml_2.value2 << "n"
            << "a_xml.value3 = " << a_xml_2.value3 << "n"
            << "a_xml.value4 = " << a_xml_2.value4 << "n"
            << "a_xml.value5 = " << a_xml_2.value5 << endl;
    }

    // JSON 序列化
    {
        std::ofstream os_json("my.json");
        cereal::JSONOutputArchive archive_json_1(os_json);
        A a_json_1(1, "2", 3, 4, "5");
        archive_json_1(
            cereal::make_nvp("a_json.v1", a_json_1.value1),
            cereal::make_nvp("a_json.v2", a_json_1.value2),
            cereal::make_nvp("a_json.v3", a_json_1.value3),
            cereal::make_nvp("a_json.v4", a_json_1.value4),
            cereal::make_nvp("a_json.v5", a_json_1.value5)
        );
    }

    // JSON 反序列化
    {
        std::ifstream is_json("my.json");
        cereal::JSONInputArchive archive_json_2(is_json);
        A a_json_2;
        archive_json_2(a_json_2.value1, a_json_2.value2, a_json_2.value3, a_json_2.value4, a_json_2.value5);
        cout << "a_json.value1 = " << a_json_2.value1 << "n"
            << "a_json.value2 = " << a_json_2.value2 << "n"
            << "a_json.value3 = " << a_json_2.value3 << "n"
            << "a_json.value4 = " << a_json_2.value4 << "n"
            << "a_json.value5 = " << a_json_2.value5 << endl;
    }

    // BIT 序列化
    {
        std::ofstream os_bit("my.binary", std::ios::binary);
        cereal::BinaryOutputArchive archive_bit_1(os_bit);
        A a_bit_1(1, "2", 3, 4, "5");
        archive_bit_1(
            cereal::make_nvp("a_bit.v1", a_bit_1.value1),
            cereal::make_nvp("a_bit.v2", a_bit_1.value2),
            cereal::make_nvp("a_bit.v3", a_bit_1.value3),
            cereal::make_nvp("a_bit.v4", a_bit_1.value4),
            cereal::make_nvp("a_bit.v5", a_bit_1.value5)
        );
    }

    // BIT 反序列化
    {
        std::ifstream is_bit("my.binary", std::ios::binary);
        cereal::BinaryInputArchive archive_bit_2(is_bit);
        A a_bit_2;
        archive_bit_2(a_bit_2.value1, a_bit_2.value2, a_bit_2.value3, a_bit_2.value4, a_bit_2.value5);
        cout << "a_bit.value1 = " << a_bit_2.value1 << "n"
            << "a_bit.value2 = " << a_bit_2.value2 << "n"
            << "a_bit.value3 = " << a_bit_2.value3 << "n"
            << "a_bit.value4 = " << a_bit_2.value4 << "n"
            << "a_bit.value5 = " << a_bit_2.value5 << endl;
    }


    getchar();
    return 0;
}

运行结果:
在这里插入图片描述

原文链接: https://www.cnblogs.com/csnd/p/15613510.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++ 序列化反序列化

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/330425

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午5:35
下一篇 2023年3月1日 下午5:35

相关推荐