14

Boost.Serializationを使用してstd::mapをシリアル化します。コードは次のようになります

void Dictionary::serialize(std::string & buffer)
{
  try {
    std::stringstream ss;
    boost::archive::binary_oarchive archive(ss);
    archive << dict_; 
    buffer = ss.str();
  } catch (const std::exception & ex) {
    throw DictionaryException(ex.what());
  }
}

void Dictionary::deserialize(const char * const data, int length)
{
  try {
    namespace io = boost::iostreams;
    io::array_source source(data, length);
    io::stream<io::array_source> in(source);
    boost::archive::binary_iarchive archive(in);
    archive >> dict_;
  } catch (const std::exception & ex) {
    throw DictionaryException(ex.what());
  }
}

MacSnowLeopardとUbuntuLucid10.04でコードをコンパイルしてテストしました。両方のシステムにBoost1.40があります。Macでは、自分でコードを作成しました。Ubuntuボックスで、aptitudeを介してバイナリを取得しました。

問題:Macでマップをシリアル化すると、Ubuntuボックスでマップを逆シリアル化できません。試してみると、無効な署名例外が発生します。

4

4 に答える 4

16

バイナリアーカイブの代わりにtext_iarchiveとを使用してみてください。ドキュメントtext_oarchiveから

このチュートリアルでは、特定のアーカイブクラス(保存にはtext_oarchive、読み込みにはtext_iarchive)を使用しました。テキストアーカイブはデータをテキストとしてレンダリングし、プラットフォーム間で移植可能です。テキストアーカイブに加えて、ライブラリにはネイティブバイナリデータとxml形式のデータのアーカイブクラスが含まれています。すべてのアーカイブクラスへのインターフェイスはすべて同じです。クラスのシリアル化が定義されると、そのクラスは任意のタイプのアーカイブにシリアル化できます。

于 2010-09-14T12:37:21.410 に答える
9

boost:archive :: binary_xarchiveは現在移植性がありません

私の解釈では、異なるプラットフォームで違いがある可能性があることを意味します。テキストアーカイブは、すべてのシステムで同じ入力/出力動作を提供します。
また、バイナリアーカイブの移植性の問題を解決しようとする関連するTODOエントリがあります:TODOエントリ

于 2010-09-14T12:38:28.463 に答える
7

text_archivesのパフォーマンスは、binary_archiveよりも大幅に遅くなります。パフォーマンスが重要な場合は、非公式のポータブルバイナリアーカイブ を試してみてくださいeos_portable_archive。私はこれを使用して、Windowsで32ビットと64ビットのデータをシリアル化して成功しました。あなたはそれをやってみることができます。

ファイルをシリアル化ディレクトリに配置する必要があります。そこにあるファイルは最新のブーストバージョン(1.44.0)で最新ではありませんが、それを機能させるには2つの非常に簡単な調整を行う必要があります(コンパイラーは非常に明白なエラーメッセージで通知します)。

于 2010-09-14T16:41:33.367 に答える
3

私は答えに同意しますが、明確なメモを追加したいと思いました。これは厄介な見落としだと思われるかもしれませんが、実際には、ポータブルバイナリ形式を考え出して実装することはそれほど簡単な作業ではありません。バイナリの問題に効果的に取り組むことを私が知っている唯一の標準はASN.1です。

XMLは同じ問題に取り組むことを目的としていますが、通常はテキストで行います。代わりにXMLがデータをバイナリ形式でエンコードできるようにするFastInfosetと呼ばれるXMLのピギーバック標準がありますが、ASN.1を使用します。

于 2010-09-14T12:59:08.437 に答える