2016-04-22 29 views
-2

オブジェクトを永続化したい場合、またはネットワーク経由で転送する場合や、特別な場合にのみ、常にC++でオブジェクトをシリアル化する必要がありますか。例えばC++でオブジェクト直列化が必要なのはなぜですか?

私はクラス

class Test 
{ 
int a; 
char b; 
float c; 
}; 

すなわちのオブジェクトを持っている場合、それが唯一のプリミティブ型が含まれています、私はそれをシリアル化する必要がありますか?

+1

これは実際に何をしたいのかによって異なります。 – Thomas

+0

「何がうまくいくか」には違いがあります。この例では、シリアライズが必要なく、「何をすべきか」という違いがあります。現実的には、データをどこに(ディスクにも)送信している場合は、シリアル化することが最善です。 – Joe

+0

オブジェクトをシリアライズする必要がある場合はオブジェクトをシリアライズし、それを永続化またはネットワーク経由で送信する必要があります。あなたが何を求めているのか不明です。 – EJP

答えて

0

はい、シリアル化する必要があります。 AからBへの情報送信時には、常にbytearrayに変換されます。サイドBは、bytearrayを「デシリアライズする」方法を知る必要があります。

1

永続化/転送されたオブジェクトの処理内容によって異なります。

同じまたは同じマシン上の同じバージョンのプログラムを使用してオブジェクトを読み戻した場合は、オブジェクトをビット単位で文字ストリームに単純にコピーすることができます。

しかし、一般的には、シリアル化する必要があります。異なるオプションでビルドされている場合、クラスにはパディングの量が異なるため、バイナリ形式が互換性がありません。異なるCPUアーキテクチャはエンディアンが異なり、intfloatのようなマルチバイト値はそれらの間で変換する必要があります。

0

これは、オブジェクトの種類とホストの種類によって異なります。

オブジェクトは簡単にコピー可能std::is_trivially_copyable参照)である必要があります。そのようなオブジェクトは、自明ではないコピー/移動コンストラクタや非自明な代入演算子を持ってはならず、些細なデストラクタを必要とします。すべてのスカラー型とスカラー型の構造体は、例えば簡単にコピー可能です。 std :: stringはそうではありません。

アプリケーションのどちらのインスタンスも、構造(例:#pragma packを参照)に対して同じパッキングアライメントを使用する必要があります。

ネットワークホストは、同じバイトオーダーを使用する必要があります。 1つのホストがビッグエンディアンを使用し、もう1つがリトルエンディアンを使用する場合、特に注意を払わずに転送できる情報の最大単位はバイト(たとえばuint8_t)です。単純なintでも、エンディアンの異なる2台のマシン間で移動することはできません(1台のマシンの0x11223344は、もう1台は0x44332211です)。

関連する問題