5

Je suis en train d'essayer de sérialiser une fonction boost :: en utilisant boost :: serialize parce que je veux le partager dans un boost :: interprocess :: message_queue. Je ne vois qu'une seule façon de le faire, c'est d'utiliser la version non-intrusive de boost :: serialize.Comment sérialiser une fonction boost :: pour l'envoyer dans un 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; 
     }  
    } 
} 

Je vais aussi besoin de sérialisation vtable et foncteur, je n'y suis pas allé, je ne suis pas sûr qu'il fonctionne.

Existe-t-il un moyen de sérialiser une fonction boost :: correctement?

Merci.

+0

'boost :: function' a [' target'] (http://www.boost.org/doc/libs/1_54_0/doc/html/boost/function.html#idp12727952-bb) et ['target_type '] (http://www.boost.org/doc/libs/1_54_0/doc/html/boost/function.html#idp39712048-bb) fonctions membres - qui peuvent être utilisées pendant la sérialisation. –

Répondre

4

Ce ne sera pas possible immédiatement.

Il y a 2 problèmes que je peux penser à:

  • passer l'identité de la fonction
  • passer le contexte de la fonction (par exemple, si elle est créée en utilisant bind ou avec un lambda)

Ni l'un ni l'autre n'est trivial, et aucun ne peut être fait sans instrumentation du code (penser réflexion/introspection).

Ce que vous voulez ici est le modèle Command, et un moyen de sérialiser ces commandes. Cela nécessite que les deux processus soient construits au-dessus d'un ensemble commun de commandes (une bibliothèque commune semble être une bonne idée) et que vous implémentiez la sérialisation et la désérialisation de vos commandes.

Pour la désérialisation, vous devez rechercher l'idiome du constructeur virtuel.

+0

C'est tellement mauvais pour moi mais merci, je vais penser au motif de commande. –

2

Je ne pense pas qu'il existe un moyen de le faire. Pour pouvoir sérialiser une fonction, vous devez pouvoir sérialiser son code binaire. Mais ce n'est pas possible car le code est au moins dépendant de la plateforme.

Vous pouvez toutefois créer une table de fonctions et sérialiser l'index d'une fonction dans cette table. Dans le désérialiseur, vous devrez construire cette même table et utiliser l'index sérialisé pour obtenir la fonction réelle de la table.