2011-07-02 17 views
0

次のコードが動作するかどうかは疑問です。そうでなければ、誰もがそれを使用していたでしょうか?私が書いた授業だけを試してみましたが、一般的なケースではうまくいくのだろうかと思います。単純にオブジェクトのメモリをCHAR[]にコピーすることによって汎用クラスにto_stream()関数を書くことができますか?例えばC++ generic to_stream()and from_stream()

memcpy(buf, (void*)&object1, sizeof(object1)) 

今、私は単にCHAR[]からオブジェクトにメモリをコピーすることで、一般的なクラスのfrom_stream()関数を書くことができますか?例えば

memcpy(&object2, buf, buf_len) // or using sizeof(C) instead of buf_len. 

P.S. 私は実際の製品でこのコードを使用するつもりはありませんが、これは単に内部をよりよく理解するための質問です。 ありがとう:-)

+2

オブジェクトをシリアル化および逆シリアル化しようとしているようです。そのための[ライブラリ](http://boost.org/doc/libs/release/libs/serialization/doc/index.html)があります。 –

答えて

2

this questionの回答で説明したように、オブジェクトを生のバイトであるかのように扱うことはできません。これは集約型/ POD型では機能しますが、そのクラスの仮想関数またはポインタ/参照を取得していれば、そのことを知ることができます。

2

いいえ、これはひどく不確定な動作です。それを試してはいけない。コンストラクタをコピーして、そのようなことが理由で存在します。

+1

'object1'が何であるかによって異なります。それがPOD /集約型の場合、これは本質的にCのコーダーが行うことです。 – Xeo

0

あなたがしようとしているのは、シリアル化を実装することです。あなたがやっているやり方は、他の参照やポインタを持つジェネリックオブジェクトではうまくいきません。自分の位置をメモリにコピーします(ポインタアドレスのみ)。これはあなたの意図ではありません。これはおそらくクラッシュし、オブジェクトが「デシリアライズ」され、メモリが解放されたり他のオブジェクトによって占有されたりすると、確かに奇妙な結果が得られます。だからdo not do

0

このようなオブジェクトは「シリアル化」しないでください。あなたはそれを間違って取得し、標準に違反します。

代わりに、オブジェクトを知的なものにして、感覚的にそれらを直列化できるようにしてください。おそらくBoost.Serializeを見てください。

次作品ならば、私は(私はないと思い、そうでない場合は、誰もが右、それを使ってきたのでしょうか?:-))不思議

それはとき例えば、いくつかの状況では、「仕事」(月仮想メンバーを持たないPODタイプ、記憶されたインダイレクションまたはその他のファンシーセマンティクスを扱う)がありますが、それは次のとおりです:

  • ghastly;
  • おそらく未定義の動作を呼び出します。

それはの理由です。なぜ人々はそれをしません。