Как сериализовать boost :: function, чтобы отправить его в message_queue - PullRequest
5 голосов
/ 15 декабря 2010

Я на самом деле пытаюсь сериализовать boost :: function с использованием boost :: serialize, потому что я хочу поделиться им в boost :: interprocess :: message_queue. Я вижу только один способ сделать это, это использовать ненавязчивую версию boost :: serialize.

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

Мне также нужно будет сериализовать vtable и functor, я не пробовал, я не уверен, что он работает.

Так есть ли способ правильно сериализовать boost :: function?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 15 декабря 2010

Это не будет возможно сразу.

Есть две проблемы, о которых я могу подумать:

  • передать идентификатор функции
  • передать контекстфункции (например, если она создана с использованием bind или с помощью лямбды)

Ни то, ни другое не является тривиальным, и ни одно из них не может быть выполнено без использования кода (например, рефлексия / самоанализ).

Здесь вам нужен шаблон Command и способ сериализации этих команд.

Для этого требуется, чтобы оба процесса были построены поверх общего набора команд (общая библиотека выглядит какхорошая идея) и что вы реализуете сериализацию и десериализацию для своих команд.

Для десериализации вы захотите найти Идиому Виртуального Конструктора.

2 голосов
/ 15 декабря 2010

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

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

...