2016-08-15 11 views
4

私はシリアル化したいと思うC++クラスをA a;と定義しました。 (それが動作するとき)、これを行うための最も簡単な方法はあるタイプシリアライズ可能なC++クラスの特性

write(fd, reinterpret_cast<uint8_t*>(&a), sizeof(a)); 

と使用して、それをリードバックする:

read(fd, reinterpret_cast<uint8_t*>(&a), sizeof(a)); 

私は、これはstd::is_pod<A>::valueが真のタイプであれば動作することを知っているが、最もリラックスしたものですこれが機能するには、型形質セットAが必要ですか?

完全性のために、これはアプリケーションの実行インスタンス間の永続性のためであり、別のプログラムや別のプラットフォームでファイルを読み込む必要はありません。

+0

あなたが正しいですイップ。 uint8_t * typo – doron

答えて

6

オブジェクトのビット単位のイメージをストリームに書き込んで、そのストリームから読み取って正しく復元することは、正確にmemcpyで動作するオブジェクトとまったく同じです。そしてそのためには、最初にという特定の特性があります。したがって、使用する特性はstd::is_trivially_copyable<A>です。


関連していないサイドノート:あなたのコードは理論的には未定義の動作を持つことができます。これは、C++でタイプcharunsigned charのエイリアシングしか許可されていないため、std::uint8_tがそれらのエイリアスであるという保証はありません。あなたは明示的にunsigned charを使用して、より良いオフにしたい:あなたが探しているものを

write(fd, reinterpret_cast<unsigned char*>(&a), sizeof(a)); 
3

はアグニューの答えに従って、is_trivially_copyableです。しかし、thjisは自明、シリアライズため、異なるコンパイラに

  • 異なるデータ型のサイズを意味するものではありません/異なるコンパイラ/ platforls /コンパイルオプションのオプションに異なるプラットフォーム
  • を上
  • バイト順序を
  • 異なるアライメントをコンパイルします

さらに、はバージョン管理に問題があります。データの意味は異なるexecuで異なる場合があります。

だからこそ、カスタム形質を導入することをお勧めします(is_doron_serializabe)。互換性が明示されていないタイプの場合は、デフォルトでfalseになります。

(あなたがを計画している何いくつかの状況でOKかもしれません。)

+1

Qをクォートする:「完全性のために、これはアプリケーションの実行インスタンス間の永続性のため、別のプログラムや別のプラットフォームでファイルを読み込む必要はありません。整列、サイズ、エンディアンなどは問題ではありません。また、なぜ私の名前はあなたの提案された特性にありますか? – Angew

+0

ほとんどのシリアライゼーションメカニズムはこのような "シンプルだから"リラックスしてから、ある種のバージョンヘッダを成長させるため、このブロックをスキップして、アラインメントが変更されたランイン、および冗長性フォールディングは、等価性のプロービング時に初期化されていないパッドバイトを含むランインを持ちます。それはインタフェースなので、そのように扱うほうがいい。あなたのコードについては何も知らないので、あなたの名前がそこにあります。例はありません。 – peterchen

+0

ああ!申し訳ありませんが、私はあなたの答えを参照したいので、あなたの名前を探して、それを混ぜた。 – peterchen

関連する問題