5

Właściwie próbuję serializować funkcję boost :: function za pomocą boost :: serialize, ponieważ chcę ją udostępnić w boost :: interprocess :: message_queue. Widzę tylko jeden sposób, aby to zrobić, to użyć nieinwazyjnej wersji boost :: serialize.Jak serializować funkcję boost :: function, aby wysłać ją w 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; 
     }  
    } 
} 

I będzie musiała serializacji vtable i funktor, ja nie spróbować, nie jestem pewien, że to działa.

Czy istnieje sposób na serializację funkcji boost :: function we właściwy sposób?

Dziękuję.

+0

'boost :: function' ma [' cel'] (http://www.boost.org/doc/libs/1_54_0/doc/html/boost/function.html#idp12727952-bb) i ['target_type '] (http://www.boost.org/doc/libs/1_54_0/doc/html/boost/function.html#idp39712048-bb) funkcje składowe - które mogą być używane podczas serializacji. –

Odpowiedz

4

Nie będzie to możliwe natychmiast.

Są 2 problemy można myśleć:

  • przechodzą tożsamości funkcji
  • przechodzą kontekst funkcji (na przykład, jeśli został utworzony stosując bind lub z lambda)

Nie jest to trywialne i nie można tego zrobić bez oprzyrządowania kodu (pomyśl odbicie/introspekcję).

To, czego chcesz, to wzór Command i sposób serializowania tych poleceń.

Wymaga to, aby oba procesy zostały zbudowane na wspólnym zestawie poleceń (wspólna biblioteka wydaje się dobrym pomysłem) oraz aby wprowadzić szeregowanie i deserializację dla poleceń.

Aby dokonać deserializacji, należy przejrzeć idiom Virtual Constructor.

+0

To jest dla mnie takie złe, ale dziękuję, pomyślę o wzorze polecenia. –

2

Nie sądzę, że jest jakikolwiek sposób to zrobić. Aby móc serializować funkcję, musisz mieć możliwość serializowania jej kodu binarnego. Nie jest to jednak możliwe, ponieważ kod jest zależny od platformy.

Można jednak utworzyć tabelę funkcji i przekształcić do postaci szeregowej indeks funkcji w tej tabeli. W deserializatorze musisz skonstruować tę samą tabelę i użyć indeksu z numerem seryjnym, aby uzyskać prawdziwą funkcję z tabeli.

Powiązane problemy