我实际上是尝试使用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?
谢谢。
答案 0 :(得分:4)
这不可能立即实现。
我可以想到两个问题:
bind
或lambda创建)两者都不是微不足道的,如果不对代码进行检测也不能做到(想想反思/内省)。
这里你想要的是Command
模式,以及一种序列化这些命令的方法。
这要求两个进程都建立在一组通用命令之上(一个常见的库似乎是个好主意),并且要为命令实现序列化和反序列化。
对于反序列化,您需要查找Virtual Constructor Idiom。
答案 1 :(得分:2)
我认为没有办法做到这一点。为了能够序列化一个函数,您需要能够序列化其二进制代码。但这是不可能的,因为代码至少取决于平台。
但是,您可以创建一个函数表并序列化该表中函数的索引。在反序列化器中,您需要构造同一个表并使用序列化索引从表中获取实际函数。