c++如何将一个类序列化再反序列化
时间: 2023-07-18 14:36:27 浏览: 279
C++ 中可以通过将类的成员变量进行序列化,将其转换为二进制格式,并将其保存到文件中,以实现序列化的操作。反序列化则是将二进制格式的数据读取出来,并将其转换为类的成员变量,再进行实例化的操作。
以下是一个简单的示例代码,演示了如何将一个类序列化再反序列化:
```c++
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class Person {
public:
string name;
int age;
void serialize(const string& filename) {
ofstream ofs(filename, ios::binary);
ofs.write(name.c_str(), name.size() + 1);
ofs.write(reinterpret_cast<const char*>(&age), sizeof(age));
}
void deserialize(const string& filename) {
ifstream ifs(filename, ios::binary);
char buf[1024];
ifs.read(buf, sizeof(buf));
name = buf;
ifs.read(reinterpret_cast<char*>(&age), sizeof(age));
}
};
int main() {
Person p1;
p1.name = "Tom";
p1.age = 20;
p1.serialize("person.bin");
Person p2;
p2.deserialize("person.bin");
cout << p2.name << ", " << p2.age << endl; // 输出:Tom, 20
return 0;
}
```
在上面的示例代码中,我们定义了一个名为 Person 的类,其中包含了一个字符串类型的 name 成员变量和一个整型的 age 成员变量。我们在 Person 类中定义了两个函数,一个是 serialize() 函数,用于将 Person 类序列化,另一个是 deserialize() 函数,用于将 Person 类反序列化。在 serialize() 函数中,我们使用 ofstream 类型的对象 ofs 将 name 和 age 成员变量以二进制格式写入到文件中;在 deserialize() 函数中,我们使用 ifstream 类型的对象 ifs 从文件中读取出二进制数据,并将其转换为 Person 类的成员变量。
在 main() 函数中,我们首先创建了一个 Person 类的实例 p1,并将其 name 和 age 成员变量设置为 "Tom" 和 20。随后,我们调用了 p1 的 serialize() 函数,将其序列化,并保存到了 person.bin 文件中。接着,我们创建了另一个 Person 类的实例 p2,并调用了其 deserialize() 函数,从 person.bin 文件中读取出二进制数据,并将其转换为 p2 的成员变量。最后,我们输出了 p2 的 name 和 age 成员变量,验证了反序列化的操作是否成功。
需要注意的是,在序列化和反序列化的过程中,我们使用了文件流对象 ofstream 和 ifstream 来进行读写操作,并使用了二进制格式来保存数据。同时,我们还需要使用 reinterpret_cast 来将指针类型进行转换,以便正确地将数据写入到文件中或读取出来。
阅读全文