如何序列化boost :: function以在message_queue中发送它

时间:2010-12-15 10:08:42

标签: c++ boost boost-serialization boost-function boost-interprocess

我实际上是尝试使用boost :: serialize序列化boost :: function,因为我想在boost :: interprocess :: message_queue中共享它。 我只看到一种方法,它是使用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?

谢谢。

2 个答案:

答案 0 :(得分:4)

这不可能立即实现。

我可以想到两个问题:

  • 传递函数的身份
  • 传递函数的上下文(例如,如果使用bind或lambda创建)

两者都不是微不足道的,如果不对代码进行检测也不能做到(想想反思/内省)。

这里你想要的是Command模式,以及一种序列化这些命令的方法。

这要求两个进程都建立在一组通用命令之上(一个常见的库似乎是个好主意),并且要为命令实现序列化和反序列化。

对于反序列化,您需要查找Virtual Constructor Idiom。

答案 1 :(得分:2)

我认为没有办法做到这一点。为了能够序列化一个函数,您需要能够序列化其二进制代码。但这是不可能的,因为代码至少取决于平台。

但是,您可以创建一个函数表并序列化该表中函数的索引。在反序列化器中,您需要构造同一个表并使用序列化索引从表中获取实际函数。