5

boost::interprocess::message_queue で共有したいので、boost::serialize を使用して実際に boost::function をシリアル化しようとしています。それを行う方法は 1 つしかありません。非侵入型の boost::serialize を使用することです。

namespace boost {   
 namespace serialization {
       template<class Archive>   
           void serialize(Archive & ar, boost::function<void()> & fct, const unsigned int version) 
       {
     ar & fct.args;
     ar & fct.arity;
     ar & fct.vtable;
     ar & fct.functor;
       }       
  }
}

また、vtable と functor をシリアル化する必要があります。試していません。動作しているかどうかはわかりません。

boost::function を適切な方法でシリアル化する方法はありますか?

ありがとうございました。

4

2 に答える 2

4

すぐにできるわけではありません。

私が考えることができる2つの問題があります:

  • 関数の ID を渡す
  • 関数のコンテキストを渡します (たとえば、bindラムダを使用して作成した場合)

どちらも些細なことではなく、コードをインストルメント化せずに行うこともできません (リフレクション/イントロスペクションを考えてください)。

ここで必要なのは、Commandパターンと、これらのコマンドをシリアル化する方法です。

これには、両方のプロセスが共通のコマンド セットの上に構築され (共通のライブラリは良い考えのようです)、コマンドのシリアライゼーションとデシリアライゼーションを実装する必要があります。

デシリアライゼーションについては、Virtual Constructor Idiom を参照する必要があります。

于 2010-12-15T10:44:06.260 に答える
2

どうしようもないと思います。関数をシリアル化できるようにするには、そのバイナリ コードをシリアル化できる必要があります。ただし、コードは少なくともプラットフォームに依存するため、これは不可能です。

ただし、関数テーブルを作成し、そのテーブル内の関数のインデックスをシリアル化することはできます。デシリアライザーでは、まったく同じテーブルを構築し、シリアル化されたインデックスを使用してテーブルから実際の関数を取得する必要があります。

于 2010-12-15T10:34:02.013 に答える