2012-03-23 14 views
-1

シリアル化に関するいくつかの実験を行っているうちに、オブジェクトが取得されたときにオブジェクト名が失われていることに気付きました。あなたは何が起こっているか私に見せてください?オブジェクトのシリアル化中に名前が失われる

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

どのようにオブジェクト名を保存していますか? –

+0

こんにちはDavid、私はオブジェクト名をchar * –

答えて

0

、ありがとうございました。オブジェクトが使用する動的に割り当てられたメモリ(std::stringstd::vector、またはmalloc、またはnewで割り当てられたもの)は、ヒープ上にあるため保存されません。動的に割り当てられたすべてのメモリも直列化して逆シリアル化する必要があります。

+0

@Binhとして保存します。[C++ミドルウェアライター](http://webEbenezer.net)がこれらの詳細を扱います。 –

+0

こんにちはDavid、私はこれを理解しています。しかし、私のオブジェクト名は静的に割り当てられ、ブロックと呼ばれる他の属性もあります。しかし、私はビットフィールドとして保存されたブロックを取得することができましたが、名前はありませんでした。私は何が起こっているのか分かりません。もしあなたが何か助けてもらえますか?ありがとう、 –

+0

@BinhVanPhamなぜあなたのクラスのコードを投稿しないでください –

2

あなたがしていることは、未定義の動作です。

Cのような構造(まだ...)を操作しない限り、あなたは、C++で(特にmallocfree)ダイレクト・メモリ操作を使用していない必要があります。

シリアライズとデシリアライズでは、適切なライブラリが必要です(または自分でコードを作成するには、まだ必要な専門知識を持っていないようです)。

Boost.Serializationを使用することをおすすめします。

しかし、その前に、C++プライマーブック(list compiled hereを参照)を読むことをお勧めします。あなたは慣用的なC++を使用していません。あなたはCのようなイディオムを使用しています。これはあなたをかむでしょう。

関連する問題