在对序列化进行一些实验时,我注意到在检索对象时我的对象名称丢失了。你能告诉我发生了什么吗?
void nDB::serialize(macro* myMacro) {
ofstream ar("macro.dat", ios::binary);
ar.write((char*)myMacro,sizeof(*myMacro));
}
macro* nDB::deserialize() {
macro* tmp_macro = (macro*)safemalloc(sizeof(macro));
ifstream ar("macro.dat", ios::binary);
ar.read((char*)tmp_macro,sizeof(*tmp_macro));
printf("My macro name is %s\n",tmp_macro->get_name());
return tmp_macro;
}
这就是我的输出
My macro name is \uffffs\uffff>
非常感谢,
答案 0 :(得分:2)
您正在做的是未定义的行为。
你应该不在C ++中使用直接内存操作(尤其是malloc
和free
),除非操纵类似C的结构(并且仍然......)。
对于序列化和反序列化,您需要一个合适的库(或者自己编写代码,但您似乎还没有必要的专业知识)。
我建议使用Boost.Serialization。
但在此之前,我建议您阅读C ++入门书(查看list compiled here)。你没有使用惯用的C ++,你使用的是类似C的习语。这会咬你的。
答案 1 :(得分:0)
您只存储对象的静态内存。您的对象使用的任何动态分配的内存(例如std::string
,std::vector
或分配有malloc
或new
的任何内容)都不会保存,因为它们位于堆上。您还必须序列化和反序列化所有动态分配的内存。