5

Я на самом деле пытаюсь сериализовать функцию boost :: с помощью boost :: serialize, потому что хочу поделиться им в 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` имеет [` target`] (http://www.boost.org/doc/libs/1_54_0/doc/html/boost/function.html#idp12727952-bb) и [`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

Я не думаю, что есть какой-либо способ сделать это. Чтобы иметь возможность сериализовать функцию, вам нужно будет сериализовать свой двоичный код. Но это невозможно, так как код, по крайней мере, зависит от платформы.

Однако вы можете создать таблицу функций и сериализовать индекс функции в этой таблице. В десериализаторе вам нужно будет построить ту же самую таблицу и использовать сериализованный индекс, чтобы получить реальную функцию из таблицы.

Смежные вопросы