【发布时间】:2014-12-19 01:48:45
【问题描述】:
可以通过使用 ios::binary 将以下 Student 类转换为二进制文件
#include <fstream>
#include <iostream>
using namespace std;
class Student{
public:
char name[40], address[120], gender;
double age;
bool is_blabla;
};
int main() {
Student one;
strcpy(one.name, "Cancan Can");
strcpy(one.address, "example example exampla");
one.gender = 'M';
one.age = 25;
one.is_blabla = true;
ofstream ofs("fifthgrade.ros", ios::binary);
ofs.write((char *)&one, sizeof(one));
Student two;
ifstream ifs("fifthgrade.ros", ios::binary);
ifs.read((char *)&two, sizeof(two));
// check if the data is OK
cout << "Student Name: " << two.name << endl;
return 0;
}
文件如下:
http://i.imgur.com/GfkheWs.png
那么在这种情况下,我该如何做同样的事情来将类转换为字节(或者说 char*)数组?
编辑:但在这种情况下,假设我有一个具有方法的类。您给出的答案是告诉我编写自己的位运算符来序列化一个复杂的类。您能否参考一个很好的资源来教授如何完成它或一个小样本/示例?
Edit2:我必须避免使用额外的库,因为我可能会在无法导入大多数库的机器/编译器上反序列化序列化代码(例如,我将尝试反序列化 nvcc 编译代码上的代码)。
示例虚拟类如下所示:
class Student{
public:
char name[40], address[120], gender;
double age;
bool is_blabla;
void set_values (int,int);
int doubleage() {return age*2;}
};
【问题讨论】:
-
正如下面的答案中所说,只需将数据复制到缓冲区中(vector
,字符串,它们都可以正常工作。请注意,如果您没有复杂的数据,所有这些都可以正常工作类中的类型,即如果您的类是 POD(普通旧数据) > 在 C++11 中,你有一个 is_pod 方法来检查你的结构是否是一个 pod。 -
由于字节序和对齐,它已经很复杂了。也就是说,请注意您对这种序列化格式的可移植性的假设(阅读:根本没有)。
-
@dau_sama,这个例子是一个假的。我实际上有具有动态状态和方法的复杂类。所以我明白你说的。能否请您参考我的资源/网站,以便我了解如何使用按位运算符序列化复杂类?
-
@cancan 如果你有复杂的类,这并不容易。你可以查看boost.org/doc/libs/1_55_0/libs/serialization/doc/index.html
标签: c++ arrays class serialization byte