5

我實際上是想使用boost :: serialize序列化boost :: function,因爲我想在boost :: interprocess :: message_queue中共享它。 我只能看到一種方法,那就是使用boost :: serialize的非侵入式版本。如何序列化一個boost ::函數在message_queue中發送它

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; 
     }  
    } 
} 

我還需要序列化虛函數表和函子,我沒有嘗試它,我不知道這是工作。

那麼有什麼辦法以正確的方式序列化boost :: function?

謝謝。

+0

'boost :: function' has ['target'](http://www.boost.org/doc/libs/1_54_0/doc/html/boost/function.html#idp12727952-bb)and ['target_type '](http://www.boost.org/doc/libs/1_54_0/doc/html/boost/function.html#idp39712048-bb)成員函數 - 可以在序列化過程中使用。 – 2013-11-09 21:04:14

回答

4

這是不可能立即。

有2個問題我能想到的:

  • 傳遞函數
  • 傳遞函數的上下文的身份(例如,如果使用bind或拉姆達創建)

兩者都不是微不足道的,如果沒有測試代碼(思考反思/內省),兩者都不可能完成。

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

這就要求兩個進程都建立在一組公共命令之上(一個公共庫似乎是一個好主意),並且要爲你的命令實現序列化和反序列化。

對於反序列化,您需要查找虛擬構造函數成語。

+0

這對我來說太糟糕了,但是謝謝你,我會考慮命令模式。 – 2010-12-15 17:57:39

2

我不認爲有什麼辦法可以做到這一點。爲了能夠序列化一個函數,你需要能夠序列化它的二進制代碼。但這是不可能的,因爲代碼至少依賴於平臺。

然而,您可能會在該表中創建一個函數表和序列化函數的索引。在反序列化器中,您需要構建完全相同的表並使用序列化索引從表中獲取真實函數。

相關問題