5

Estoy intentando serializar una función boost :: utilizando boost :: serialize porque quiero compartirlo en un boost :: interprocess :: message_queue. Solo veo una forma de hacerlo, es utilizar la versión no intrusiva de boost :: serialize.Cómo serializar una función boost :: para enviarla en 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; 
     }  
    } 
} 

yo también necesito para serializar vtable y funtor, yo no lo probé, no estoy seguro de que está trabajando.

¿Hay alguna forma de serializar una función boost :: de manera adecuada?

Gracias.

+0

'boost :: function' tiene [' target'] (http://www.boost.org/doc/libs/1_54_0/doc/html/boost/function.html#idp12727952-bb) y ['target_type '] (http://www.boost.org/doc/libs/1_54_0/doc/html/boost/function.html#idp39712048-bb) funciones miembro - que se pueden utilizar durante la serialización. –

Respuesta

4

No será posible de inmediato.

Hay 2 problemas que se me ocurre:

  • pasar la identidad de la función
  • pasar el contexto de la función (por ejemplo, si se ha creado usando bind o con un lambda)

Ninguno es trivial, y ninguno puede hacerse sin instrumentar el código (piense en reflexión/introspección).

Lo que quiere aquí es el patrón Command, y una forma de serializar esos comandos.

Esto requiere que ambos procesos se construyan sobre un conjunto común de comandos (una biblioteca común parece una buena idea) y que implemente serialización y deserialización para sus comandos.

Para la deserialización, querrá buscar el lenguaje virtual Constructor.

+0

Es tan malo para mí, pero gracias, voy a pensar en el patrón de comando. –

2

No creo que haya ninguna manera de hacerlo. Para poder serializar una función, necesitaría poder serializar su código binario. Pero eso no es posible ya que el código es al menos dependiente de la plataforma.

Sin embargo, puede crear una tabla de funciones y serializar el índice de una función en esa tabla. En el deserializador necesitaría construir esa misma tabla y usar el índice serializado para obtener la función real de la tabla.

Cuestiones relacionadas