Boost.Serialization и Boost.Python двусторонний рассол - PullRequest
5 голосов
/ 03 сентября 2011

У меня есть библиотека C ++, которая использует Boost.Serialization. Я создаю привязки Python для этой библиотеки, используя Boost.Python. Совершенно ясно, как создать пакет рассола для Boost.Python, использующий Boost.Serialization (сохранить в строку с помощью Boost.Serialization и вернуть эту строку в Python).

То, что я хочу, это наоборот: учитывая boost::python::object, я хочу иметь функцию serialize(...), которая будет вызывать функцию Python pickle.dumps() и сериализовать полученную строку. (Представьте себе std::vector<boost::python::object>. Когда я сериализую этот вектор, Boost.Serialization вызовет вспомогательную функцию serialize().) Возможно ли это? Еще лучше, возможно ли использовать cPickle и обойти, передавая управление интерпретатору Python?

1 Ответ

0 голосов
/ 06 сентября 2011

Вот код, который я использую для выбора / восстановления экземпляра boost :: mersenne_twister

typedef boost::mt19937 rng_t;

struct mt_pickle_suite : bp::pickle_suite {

  static bp::object getstate (const rng_t& rng) {
    std::ostringstream os;
    boost::archive::binary_oarchive oa(os);
    oa << rng;
    return bp::str (os.str());
  }

static void
  setstate(rng_t& rng, bp::object entries) {
    bp::str s = bp::extract<bp::str> (entries)();
    std::string st = bp::extract<std::string> (s)();
    std::istringstream is (st);

    boost::archive::binary_iarchive ia (is);
    ia >> rng;
  }
};
...