5

Ich bin eigentlich versucht, eine boost :: -Funktion mit boost :: serialize serialisieren, weil ich es in einem boost :: interprocess :: message_queue teilen möchten. Ich sehe nur einen Weg, dies zu tun, ist es, die nicht intrusive Version von boost :: serialize zu verwenden.Wie serialisiert eine Boost :: -Funktion, um es in einer Message_Queue zu senden

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

Ich werde auch VTable und Funktors serialisiert werden müssen, ich habe es nicht versuchen, ich bin nicht sicher, ob es funktioniert.

Also gibt es eine Möglichkeit, eine boost :: -Funktion ordnungsgemäß zu serialisieren?

Vielen Dank.

+0

'boost :: function' hat [' target'] (http://www.boost.org/doc/libs/1_54_0/doc/html/boost/function.html#idp12727952-bb) und ['target_type '] (http://www.boost.org/doc/libs/1_54_0/doc/html/boost/function.html#idp39712048-bb) Elementfunktionen - die während der Serialisierung verwendet werden können. –

Antwort

4

Es wird nicht sofort möglich sein.

Es gibt zwei Probleme, die ich denken kann:

  • die Identität der Funktion übergeben
  • den Kontext der Funktion übergeben (zum Beispiel erstellt, wenn bind oder mit einem Lambda-Verwendung)

Weder ist trivial, noch kann getan werden, ohne den Code zu instrumentieren (denke Reflexion/Introspektion).

Was Sie hier wollen, ist die Command Muster, und eine Möglichkeit, diese Befehle zu serialisieren.

Dies erfordert, dass beide Prozesse auf einem gemeinsamen Satz von Befehlen (eine gemeinsame Bibliothek scheint eine gute Idee) und dass Sie Serialisierung und Deserialisierung für Ihre Befehle implementieren.

Für die Deserialisierung sollten Sie das Virtual Constructor Idiom nachschlagen.

+0

Es ist so schlimm für mich, aber danke, ich werde über das Befehlsmuster nachdenken. –

2

Ich glaube nicht, dass es einen Weg gibt, es zu tun. Um eine Funktion serialisieren zu können, müssten Sie in der Lage sein, ihren Binärcode zu serialisieren. Aber das ist nicht möglich, da der Code zumindest plattformabhängig ist.

Sie können jedoch eine Funktionstabelle erstellen und den Index einer Funktion in dieser Tabelle serialisieren. Im Deserializer müssten Sie genau diese Tabelle erstellen und den serialisierten Index verwenden, um die echte Funktion aus der Tabelle zu erhalten.