C++的序列化和反序列化

序列化:把对象转化为可传输的字节序列过程称为序列化。

反序列化:把字节序列还原为对象的过程称为反序列化。

C++代码实现

#include <iostream>
#include <fstream>

class Data {
public:
    // write data
    std::ofstream& operator>>(std::ofstream& ofs) {
        ofs.write(reinterpret_cast<char*>(this), sizeof *this);
        return ofs;
    }
    // read data
    std::ifstream& operator<<(std::ifstream& ifs) {
        ifs.read(reinterpret_cast<char*>(this), sizeof *this);
        return ifs;
    }

    // data
    char   _c;
    int    _i;
    float  _f;
    double _d;
};

// write data
std::ofstream& operator<<(std::ofstream& ofs, Data& d)
{
    return d >> ofs;
}
// read data
std::ifstream& operator>>(std::ifstream& ifs, Data& d)
{
    return d << ifs;
}

void print(const Data& d)
{
    std::cout << d._c << ", " << d._i << ", " << d._f << ", " << d._d << std::endl;
}

int main(int, char**)
{
    // 序列化
    // write binary file
    std::cout << "write data: " << std::endl;
    Data w1 = {'a', 100, 1.14, 1.14};
    Data w2 = {'b', 200, 2.14, 2.14};
    Data w3 = {'c', 300, 3.14, 3.14};

    print(w1);
    print(w2);
    print(w3);

    std::ofstream ofs("data.bin", std::ifstream::binary);
    ofs << w1 << w2 << w3;
    ofs.close();

    // 反序列化
    // read binary file
    std::cout << "read data: " << std::endl;
    Data r1, r2, r3;
    std::ifstream ifs("data.bin", std::ifstream::binary);
    ifs >> r1 >> r2 >> r3;
    ifs.close();

    print(r1);
    print(r2);
    print(r3);

    return 0;
}

输出结果

write data:

a, 100, 1.14, 1.14

b, 200, 2.14, 2.14

c, 300, 3.14, 3.14

read data:

a, 100, 1.14, 1.14

b, 200, 2.14, 2.14

c, 300, 3.14, 3.14

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 序列化是指将对象转换为可以存储或传输的格式,而反序列化是将序列化的对象重新转换为原始对象。 在计算机科学中,对象通常是存储在内存中的数据结构。当我们需要将这些对象保存到硬盘上或者通过网络传输时,就需要将其序列化序列化过程将对象的状态转换为字节流,这样就可以将其保存到文件或者通过网络传输。序列化可以实现数据的长期保存和远程传输。 反序列化序列化的逆过程。通过读取存储在文件或网络中的字节流,反序列化可以将其还原为原始的对象。反序列化操作可以在不同的计算机或进程之间进行,从而实现对象的共享和数据传输。 序列化反序列化在许多应用中非常重要。例如,在分布式系统中,可以通过将对象序列化反序列化来传输数据和状态。在面向对象的数据库中,对象的序列化反序列化可以实现数据的持久化和恢复。此外,序列化反序列化还可以用于远程方法调用、缓存和对象传递等方面。 总之,序列化反序列化是将对象在不同环境中的存储和传输的过程。序列化将对象转换为字节流,而反序列化则将字节流还原为原始的对象。这两个过程在许多计算机应用中起着重要的作用。 ### 回答2: 序列化是将对象转换为字节流的过程,可以将对象在网络传输、持久化存储以及分布式计算等场景中进行传输和存储。反序列化则是将字节流转换为对象的过程,将序列化后的字节流重新转化为原始的Java对象。 在序列化过程中,对象的状态信息包括实例变量的值、类名称以及对象的元数据等都会被保存到字节流中。这个字节流可以用于保存到文件或者通过网络传输给其他系统。序列化的作用是可以将对象的状态信息进行持久化存储,即使程序结束后再次开始时也能够恢复之前的状态。 而反序列化是将字节流转化为对象的过程。这个过程需要根据序列化的规则和定义来进行,即反序列化的过程需要与序列化时使用的规则和定义相对应。当需要从文件或者其他系统中恢复之前序列化的对象时,就需要进行反序列化操作。 在Java中,可以通过实现Serializable接口来指示该类可以被序列化。Serializable接口是一个标记接口,没有定义任何方法,但是当一个类实现了Serializable接口后,就代表这个类的对象可以被序列化反序列化。 总的来说,序列化反序列化是一种将对象转换为字节流和将字节流转换为对象的机制。通过序列化,对象的状态信息可以进行持久化的存储和传输,在需要时可以通过反序列化将对象的状态信息重新恢复。 ### 回答3: 序列化反序列化是编程中常用到的两个概念。序列化是将数据在内存中的对象转化为可存储或传输的格式,而反序列化则是将已序列化的数据还原为内存中的对象。 在使用序列化时,可以将对象转化为字节流、XML文档或JSON字符串等形式,以便于保存到文件、数据库或在网络中传输。序列化的过程将对象的状态信息保存下来,包括对象的字段值、属性值以及相关的类信息,从而可以在需要时重新创建对象。 反序列化则是将序列化后的数据重新还原为原来的对象。通过反序列化,可以恢复对象在序列化前的状态,从而可以继续使用、传输或持久化存储。 序列化反序列化的应用场景很多,比如在分布式系统中,可以将对象序列化后使用网络传输,实现不同进程或不同机器之间的通信。另外,在持久化存储方面,可以将对象序列化后保存到磁盘或数据库中,以便下次使用时快速还原对象。 在Java中,序列化反序列化可以通过实现Serializable接口来完成。对于其他编程语言,也通常提供了类似的序列化机制。 总之,序列化反序列化是编程中重要的概念,可以方便地在不同环境中传输、保存和还原对象,提升程序的灵活性和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值