11

実行しているアプリケーションに問題があります。ブーストシリアル化を使用していくつかのパケットをシリアル化する必要があります。ドキュメントによると、BOOST_CLASS_EXPORT_KEYそれぞれBOOST_CLASS_EXPORT_IMPLEMENT.hppファイルと.cppファイルを使用して、ポリモーフィックベースポインタを使用して派生クラスをシリアル化できます。

だからここに私が持っているものがあります:

.hpp:クラス宣言を含み、最後にBOOST_CLASS_EXPORT_KEY(mynamespace::mypacket)

.cpp:私のクラス定義とBOOST_CLASS_EXPORT_IMPLEMENT(mynamespace::mypacket)

この時点まではすべて正常に実行されますが、シリアル化する必要がある場合は、bad_allocエラーが発生します。

register_type<mypacket>()使用する必要のあるアーカイブのメソッドを明示的に呼び出すことで、この問題を回避しました。

しかし、ここに私の質問があります:ブーストのEXPORT *は、register_typeメソッドの呼び出しを回避することを意味しますか、それとも私は何か間違ったことをしていますか?コードで同じ作業を2回行うような気がしますが、それ以上に、アーカイブでregister_typeを使用する必要がある場合は、エクスポートキーと実装を使用する利点がありません。

私はここや他の場所で他のいくつかの投稿を読みました。問題を実験したのは私だけではないようですが、まだ答えは見つかりませんでした。

4

1 に答える 1

14

アーカイブでregister_typeを呼び出さないようにする方法を見つけました。興味があるかもしれない人のために、それはキーと実装をエクスポートするだけでなく、テンプレートのシリアル化の特殊化を行う必要があります。

したがって、.hppは次のようになります。

  • クラス宣言(mynamespace :: myclass)
  • クラスエクスポート:BOOST_CLASS_EXPORT_KEY(mynamespace::myclass)

そしてcppで:

  • クラス定義
  • クラスエクスポート:BOOST_CLASS_EXPORT_IMPLEMENT(mynamespace::myclass)
  • AND:クラスごとに使用する必要のあるアーカイブのserialize()メンバーの特殊化:

template void mynamespace::mypacket::serialize(boost::archive::text_iarchive& arch, const unsigned int version);

template void mynamespace::mypacket::serialize(boost::archive::text_oarchive& arch, const unsigned int version);

boost :: archive :: text_(i / o)archiveは、使用しているあらゆる種類のブーストアーカイブに置き換える必要があります。

それがいつか誰かを助けることを願っています(これはブーストドキュメントに明確に書かれていますが、私は今日までそれを見逃していたに違いありません...)

于 2012-10-08T13:27:51.690 に答える