簡體   English   中英

Boost.Serialization 和 Boost.Python 雙向泡菜

[英]Boost.Serialization and Boost.Python two-way pickle

我有一個使用 Boost.Serialization 的 C++ 庫。 我正在使用 Boost.Python 為這個庫創建 Python 綁定。 如何為使用 Boost.Serialization 的 Boost.Python 創建一個 pickle 套件(使用 Boost.Serialization 保存到一個字符串,然后將該字符串返回給 Python)是相當清楚的。

我想要的是相反的:給定一個boost::python::object ,我想要一個serialize(...)函數來調用 Python 的pickle.dumps()函數並序列化結果字符串。 (想象一個std::vector<boost::python::object> 。當我序列化這個向量時,Boost.Serialization 會調用輔助serialize()函數。)這可能嗎? 更好的是,是否可以使用cPickle並繞過將控制權交給 Python 解釋器?

這是我用來pickle/unpickle 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;
  }
};

如果您的對象是本機 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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM