序列化对象时丢失名称

时间:2012-03-23 01:07:04

标签: c++ boost c++11

在对序列化进行一些实验时,我注意到在检索对象时我的对象名称丢失了。你能告诉我发生了什么吗?

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>

非常感谢,

2 个答案:

答案 0 :(得分:2)

您正在做的是未定义的行为。

你应该在C ++中使用直接内存操作(尤其是mallocfree),除非操纵类似C的结构(并且仍然......)。

对于序列化和反序列化,您需要一个合适的库(或者自己编写代码,但您似乎还没有必要的专业知识)。

我建议使用Boost.Serialization。

但在此之前,我建议您阅读C ++入门书(查看list compiled here)。你没有使用惯用的C ++,你使用的是类似C的习语。这会咬你的。

答案 1 :(得分:0)

您只存储对象的静态内存。您的对象使用的任何动态分配的内存(例如std::stringstd::vector或分配有mallocnew的任何内容)都不会保存,因为它们位于堆上。您还必须序列化和反序列化所有动态分配的内存。