2012-01-02 5 views
2

私はC++オブジェクトのシリアル化ライブラリを作成しています。これは自己学習と機能強化のためのものです。&私はブーストやGoogleプロトコルbufのような既製のライブラリを使いたくありません。 あなたの経験やコメントを伝えてください(タグ価値などのエンコーディングを作成するなど)。 PODをサポートし、それに続いて非線形DSをサポートしたいと考えています。C++オブジェクトのシリアル化手法に関する提案

おかげで PS:HNY2012

答えて

0

私は何年か前に記事を書きました。コードとツールは時代遅れになる可能性がありますが、概念は変わりません。

thisがお手伝いできます。

+0

ありがとう@Emilio Garavaglia。私は洞察のためにあなたの記事を調べます – sanjayk79

1

プロセス間通信のためにシリアル化が必要な場合は、インターフェイスを定義するためにいくつかのインターフェイス言語(IDLまたはASN.1)を使用することをお勧めします。

他の言語(C++よりも)もサポートしやすくなります。また、コード/スタブジェネレータを実装する方が簡単です。

+0

はい、私の目的はワイヤでオブジェクトを送信することです。 IDL/ASNを使用している場合。1では、私のデータ型をエンコーディングするために対応するコンパイラ(idlコンパイラ)を使用する必要があります。本質的には(BER/PER)などです。データをパックし、ワイヤで送信するための独自のエンコーディングを定義したかったのです。 – sanjayk79

1

私はこの数ヶ月間、似たようなことに取り組んできました。私はBoostを使うことができませんでした。なぜなら、既存のクラス(大規模な既存のコードベース)をシリアル化し、serialize()仮想関数を持つインタフェースからクラスを継承するのは不適切でした(多重継承を必要としません) 。

撮影したアプローチは、次の顕著な特徴を持っていた:

  1. は、その特定のクラスをシリアル化するタスクに指定された既存の各クラスのヘルパークラスを作成し、クラスの友人が連載されているヘルパークラスを作ります。これにより、直列化されるクラスに継承が導入されるのを回避し、ヘルパークラスがプライベート変数にアクセスできるようになります。
  2. それぞれのヘルパークラス(それらを「シリアライザ」と呼ぶ)を自分自身をグローバルマップに登録させます。各シリアライザクラスはclone()仮想関数( 'prototype'パターン)を実装しています。この関数は、このマップからクラス名を指定してシリアライザへのポインタを取得できるようにします。名前は、コンパイラ固有のRTTI情報を使用して取得されます。グローバルマップへの登録は、静的ポインタをインスタンス化し、それらを 'new'することによって処理されます。静的変数は、プログラムの開始前に作成されるためです。
  3. 特殊なストリームオブジェクト(std::fstreamから派生)が作成されました。これには、ポインタ以外のデータ型、ポインタデータ型、およびSTLデータ型をシリアル化するためのテンプレート関数が含まれています。ストリームオブジェクトは、設計上、読み取り専用モードまたは書き込み専用モードでしか開くことができないため、ファイルの読み込みまたはファイルへの書き込みには、同じserialize()関数を使用できます。ストリームが開かれました。したがって、クラスメンバーの読み書きの順番に不一致が生じる可能性はありません。
  4. オブジェクトの保存または復元時には、変数のアドレスに基づいて一意のタグ(整数)が作成され、マップに格納されます。同じアドレスが再度発生した場合、ディープコピーされたオブジェクト自体ではなく、タグだけが保存されました。したがって、各オブジェクトはファイルに1回だけ深くコピーされました。

上記の共有アイデアのいくつかは、ウェブ上のページで確認できます。http://www.cs.sjsu.edu/~pearce/modules/lectures/cpp/Serialization.htm。希望が役立ちます。

+0

[Boostでクラスをシリアライズ可能にするために何かを継承する必要はありません。](http://www.boost.org/doc/libs/1_48_0/libs/serialization/doc/tutorial.html#nonintrusiveversion)。あなたがクラスを直列化するのに十分ではないが何かを継承する必要がない場合は、private変数が 'serialize()'関数に見えるようにクラスを変更する必要があるかもしれません。 –

+0

合意。しかし、Boostは、すでに複雑な階層構造を持っていたため、導入するのが非常に複雑でした。手作業で行われたことは、長期的にはより適切で維持可能に見えました。 – Somesh

+0

ありがとうSomesh、あなたの入力は本当に役立ちます。私はあなたから提供されたリンクを通過しています。私は、ネットワークを介して通信するために、シリアル化されたオブジェクトを使用しています。この記事では、非線形DS(thats good)のサポートについても説明します。私は一度私は私の最初のプロトタイプを持っているこれについて議論するより多くを持っている:) – sanjayk79

関連する問題