5

我实际上是在尝试使用 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 吗?

谢谢你。

4

2 回答 2

4

这不会立即成为可能。

我能想到的有2个问题:

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

两者都不是微不足道的,而且如果不检测代码(想想反射/内省),都无法完成。

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

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

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

于 2010-12-15T10:44:06.260 回答
2

我不认为有任何方法可以做到这一点。为了能够序列化一个函数,您需要能够序列化它的二进制代码。但这是不可能的,因为代码至少依赖于平台。

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

于 2010-12-15T10:34:02.013 回答