c++序列化以及反序列化实现

1 什么是序列化和反序列化

当我们在写程序时,比如说我们自定义了一个实体类Person,然后在程序中创建一个该实体类对象,并给对象赋了一些值,但是我们想将这些数据发给我们的其他的程序员朋友,让他们也可以调用我们创建的这个实体类并使用我们的数据,这个时候我们就需要使用到序列化和发序列化。

1.1 序列化

序列化就是将内存中运行的程序中的数据结构数据存储到磁盘的文件中,使其能够持久化存在电脑中,就算程序停止,这些数据也能一直存在。、

1.2 反序列化

顾名思义,也就是序列化的反操作,就是将已经存在磁盘文件中的数据读取到程序中继续使用的这么一个操作。

2 代码实现

#include <iostream>
#include "string.h"
#include <fstream>

using namespace std;

//定义了一个实体类 Person
class Person
{
public:
    Person(char* name, int age)
    {
        strcpy(this->name, name);
        this->age = age;
    }
    Person() {}
    void showInfo()
    {
        cout << name << " " << age << endl;
    }
    int getAge()
    {
        return age;
    }
    char * getName()
    {
        return name;
    }

public:
    char name[10] { 0 };
    int age = 0;
};

//二进制文件 进行写
void WriteBinaryFile(Person * ps,int size)
{
    ofstream file("binary.txt",ios::out | ios::binary );
    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
    }

    for (int i=0;i<size;i++)
    {
        file.write((char*)&ps[i],sizeof(Person));
    }

    file.close();
}

//二进制文件 进行读
Person * ReadBinaryFile()
{
    ifstream file("binary.txt", ios::in | ios::binary);

    if (!file.is_open())
    {
        cout << "文件打开失败" << endl;
    }

    //开辟一块空间 存放读取的数据
    char* temp = new char[sizeof(Person)];
    //或者 Person p;开辟的空间肯定合适
    //Person temp;
    Person* ps = new Person[5];
    int i=0;
    //将数据读入的 temp对应的空间
    while (file.read(temp,sizeof(Person)))
    {
        Person p = *(Person*)temp;
        ps[i] = p;
        i++;
    }

    file.close();
    return ps;
}

int main(int argc, char *argv[])
{
    //序列化操作  往文件中写数据
//    Person* ps = new Person[5];
//    ps[0] = Person("Lay1", 11);
//    ps[1] = Person("Lay1", 12);
//    ps[3] = Person("Lay1", 13);
//    ps[2] = Person("Lay1", 14);
//    ps[4] = Person("Lay1", 15);
//    WriteBinaryFile(ps,5);

    //反序列化操作  程序读取文件中的数据
    Person* ps2;
    ps2 = ReadBinaryFile();
    for (int i=0; i<5; i++)
    {
        cout << ps2[i].getName() << " " << ps2[i].getAge() << endl;
    }

    return 0;
}

存储在文件中的内容的样子:

样子

运行结果:

运行结果

写在最后

欢迎大家关注鄙人的公众号【麦田里的守望者zhg】,让我们一起成长,谢谢。我的博客

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:要想使用网络框架的API来传输结构化的数据,必须得先实现结构化的数据与字节流之间的双向转换。这种将结构化数据转换成字节流的过程,称为序列化,反过来转换,就是反序列化。简单来说,序列化就是将对象实例的状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它依据流重构对象。\[2\]在C++中,可以使用一些库或框架来实现序列化反序列化。比如,可以使用Boost库中的Serialization模块来实现对象的序列化反序列化。Boost.Serialization提供了一种简单的方式来将C++对象序列化为字节流,并将字节流反序列化为原始对象。此外,C++标准库中也提供了一些序列化反序列化的功能,比如使用iostream库中的<<和>>运算符重载来实现对象的序列化反序列化。另外,还可以使用Google的Protocol Buffers库来实现C++对象的序列化反序列化。这个库提供了一种语言无关、平台无关、可扩展的序列化机制,可以将结构化数据序列化为二进制格式,以便在不同的系统之间进行数据交换。总之,C++中有多种方法可以实现对象的序列化反序列化,具体选择哪种方法取决于具体的需求和使用场景。 #### 引用[.reference_title] - *1* *2* [C++ 序列化反序列化](https://blog.csdn.net/JMW1407/article/details/107173775)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [c++序列化以及反序列化实现](https://blog.csdn.net/qq_33521184/article/details/125228533)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值