2

私は分散C++アプリケーションを持っています。これは、2台のマシンに分散された4つのプロセスで構成されています。アプリケーションの1つは、残りのアプリケーションの「コントロールセンター」として機能します。

現在の状態をファイルに保存して、後で再度ロードできるようにしたい。「状態」とは正確には、システム内の各モジュールによって個別に定義されます。保存するときは、モジュールの状態を1つのファイルにまとめる必要があります。ロード時に、各モジュールはファイルから状態データを読み戻す必要があります。

一部のユーザーが編集するため、状態は人間が読めるテキストファイルに保存する必要があります。したがって、バイナリファイル形式はオプションではありません。さらに、XMLやYAMLなどの標準ファイル形式が推奨されます。

今説明したように、状態の保存/読み込みの基本的なフレームワークをどのように実装することをお勧めしますか?このタスクに必要な最小限のデータシリアル化作業を行うことを好みます。また、フレームワークでは、将来保存するデータを簡単に追加できるようにする必要があります。

4

3 に答える 3

7

boost.Serializelibを見てください。これは、オブジェクトを(xml)ファイルに(非)ストリーミングするための非常に優れたライブラリです。

Load and Save関数を作成する代わりに、クラスはシリアル化関数を作成するだけで済み、この関数は両方の方法で機能します。

class X
{
   friend class boost::serialization::access;
   template<class Archive>
   void serialize(Archive & ar, const unsigned int version)
   {
       ar & make_nvp("degrees(=xml_tagname)", degrees);
       ar & make_nvp("minutes(=xml_tagname)", minutes);;
       ar & BOOST_SERIALIZATION_NVP(seconds);  // =auto xml tag
   }
}
于 2009-09-09T08:23:28.303 に答える
2

XMLを使用します。各クラスに保存機能と読み込み機能を持たせます。次に、XMLで、クラスの名前として最高レベルのタグを配置します。そうすれば、ロードバックするときに、使用するクラスを検索して作成し、そのLoad関数を呼び出すことができます。

于 2009-09-09T08:17:21.610 に答える
1

私は間違いなくXMLの側にいます。各プロセスで保存されたデータをプロセス識別子タグで囲むと便利です。プラグインに含まれるデータを保存/ロードするためにアプリケーションで同様のシステムを使用しており、非常に便利で拡張可能です。

私の最初のアプローチはこれです:

  1. コントロールセンター(CC)が保存を開始します。
  2. CCは各プロセスに保存信号を送信します。
  3. 各プロセスは、プロセス識別子を含むXMLの独自の部分を形成し、CCに送信します
  4. CCは、これらのXMLスニペットを収集し、それらを1つの大きなファイルに結合して、ディスクに保存します。

ロード時:

  1. CCはXMLファイルを読み取ります。
  2. プロセス識別子に遭遇すると、適切なパーツをロード信号とともに対応するプロセスに送信します。
  3. 各プロセスは独自のパーツをロードし、ロード完了信号をCCに送信します。
  4. すべてのプロセスの読み込みが完了すると、CCはプロセスに開始信号を送信し、通常のワークフローを開始します。
于 2009-09-09T08:25:48.967 に答える