6

我有一个使用 Boost.Serialization 的 C++ 库。我正在使用 Boost.Python 为这个库创建 Python 绑定。很清楚如何为使用 Boost.Serialization 的 Boost.Python 制作一个 pickle 套件(使用 Boost.Serialization 保存到字符串,然后将该字符串返回给 Python)。

我想要的是相反的:给定 a boost::python::object,我想要一个serialize(...)函数来调用 Python 的pickle.dumps()函数并序列化生成的字符串。(想象一下std::vector<boost::python::object>。当我序列化这个向量时,Boost.Serialization 会调用辅助serialize()函数。)这可能吗?更好的是,是否可以使用cPickle和绕过将控制权交给 Python 解释器?

4

2 回答 2

1

这是我用来腌制/取消腌制 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;
  }
};
于 2011-09-06T12:33:04.107 回答
0

如果您的对象是本机 python 对象,那么 pickle.dumps() 就可以了。

另一方面,如果你有一个 std::vector,那么你就是在混合 c++ 和 python。为此,您需要注册 std::vector ,例如:

using PyVec = std::vector<boost::python::object>;
boost::python::_class<PyVec, boost::noncopyable>
    ("PyVec", "My vector of PyObjects", boost::python::init<>() )
    .enable_pickling()
    .def_pickle( py_vec_pickle_suit() );

然后,当然你需要定义一套泡菜套装。但这太麻烦了。

TL;DR:改用 boost::python::list 并调用 dump 。

于 2020-04-09T13:41:18.717 回答