3

シリアル化のための一般的でポータブルな方法でタイプを識別する方法はありますか?私は知っstd::type_indexstd::type_infoいて、プラットフォームに依存しており、シリアル化には使用できません。

1つの方法は、と1つの「タイプ情報」の間にマップを作成し、std::type_index「タイプ情報」をシリアル化することですが、これによりシリアル化が遅くなります。

これを行う標準的な方法はありますか?

PS:効率的なシリアル化の方法を学びたいのですが、ライブラリは使いたくありません。

4

2 に答える 2

1

シリアル化のための一般的でポータブルな方法でタイプを識別する方法はありますか?

それは一般的ですが移植性のない方法で可能です。

から返される文字列は、std::type_info::name()多くの場合、型を一意に識別するマングルされた型名です。この名前は、シリアル化されたオブジェクトのタイプを識別するために使用できます。

名前マングリングはコンパイラごとに異なるため、別のコンパイラでコンパイルされたプログラムは、シリアル化されたオブジェクトの読み取りに失敗する可能性があります。

于 2013-02-09T14:33:05.853 に答える
1

オブジェクトをあるプロセスから別のプロセスに渡したい場合、それらのプロセスがたまたま異なる時間に異なるマシン上に存在する場合、あなたが見ているのはシリアル化よりもメッセンジャーです。

そこには効率的なメッセージングライブラリがあります。GoogleのProtobufまたはApacheのThriftが良い例です。

重要なアイデアは、メッセージの定義を外部化して、プラットフォーム(およびコンパイラー)の両方に依存しないようにし、その定義からコードバインディングを生成することです。次に、コードからメッセージをメモリ内に作成し、そのメッセージ(xml / json / binary)をシリアル化し、別のプラットフォームでメッセージを別のメモリ内表現に逆シリアル化します。

それが補足的なステップのように感じるなら、そうです。一方、メッセージ形式は内部実装(間接化のレイヤー...)に関連付けられていないため、メッセージの読み取り/書き込みを行いながら、内部実装を自由に変更できます。さまざまなバージョンで(たとえば、プログラムの古い展開バージョンとの対話用)。

于 2013-02-09T16:12:51.200 に答える