我的平面对象定义如下:
class Student
{
public:
char name[20];
long num;
public:
Student(char *name, long num) : num(num)
{
strcpy(this->name, name);
}
Student() : num(0)
{
strcpy(this->name, "");
}
void Serialize(ostream&);
static Student Deserialize(istream&);
};
在main函数中,我创建了一个对象:Student stu("Hello", -1);
然后继续将其序列化为一个文件,然后我再次在ifstream
中打开。两个流都以二进制模式打开。当我尝试检索反序列化对象中的值时,只有名称是corerct,而数字似乎是随机内存块。此外,ifstream
存在并设置了失败位,表示出现了问题。以下是反序列化函数的实现:
Student Student::Deserialize(istream &in)
{
cout << "Starting deserialization (short)" << endl;
Student stu;
if (in.good())
{
in.read((char *) &stu, sizeof(Student));
}
if (in.fail())
{
cerr << "Deserialization failed (short)" << endl;
}
return stu;
}
我在这件事上称之为:
ifstream ifile("test.bin", ios::binary);
Student stu2;
stu2 = Student::Deserialize(ifile);
根据要求,这是序列化函数:
void Student::Serialize(ostream &out)
{
cout << "Serializing student: " << name << endl;
if (out.good())
{
out.write(name, 20); // name
out.write((char *) &num, sizeof(num)); // num
out.flush();
}
if (out.bad())
{
cerr << "Read error on IO operation" << endl;
}
if (out.fail())
{
cerr << "Serialization failed" << endl;
}
else
{
cout << "Serialization succesful" << endl;
}
}
由test.bin
给出的文件od
的十六进制内容,后跟反序列化对象的内容:
0000000 654a 6e61 4c2d 6375 4e00 0072 0000 0000
0000020 8150 d609 ffff ffff ffff ffff
0000034
Name: Hello
Number: 4294967295
答案 0 :(得分:2)
您的Serialize()
功能正在保存Student
的成员。您的Deserialize()
函数正在尝试一次读取整个Student
。这不会因多种原因而起作用,数据对齐只是其中之一(即使您完全正确地处理了其他所有事情。)
因此,两种方法的工作方式完全相同:按成员序列化和反序列化成员,或序列化和反序列化整个类。