序列化对象时丢失名称

问题描述:

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

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

如何存储对象名称? – 2012-03-23 02:11:57

+0

嗨大卫,我存储的对象名称char * – 2012-03-23 19:56:29

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

+0

@Binh [C++中间件作家](http://webEbenezer.net)照顾这些细节。 – 2012-03-23 03:22:32

+0

嗨大卫,我明白这一点。但是,我的对象名称是静态分配的,还有一个名为block的属性。但是,我能够检索存储为位域但没有名称的块。我不知道发生了什么。如果你有任何想法,请你帮忙。谢谢 – 2012-03-23 20:11:16

+0

@BinhVanPham你为什么不发布你的课程的代码 – 2012-03-23 20:12:33

你在做什么是未定义的行为。

你应该在C++使用直接内存操作(尤其是mallocfree),除非操作C-状结构(现在仍然...)。对于序列化和反序列化,您需要一个合适的库(或自己编写一个代码,但您似乎没有必要的专业知识)。

我会推荐使用Boost.Serialization。

但在此之前,我会推荐阅读C++入门书(请查看list compiled here)。你没有使用惯用的C++,你正在使用类似C的习惯用法。这会咬你。