[英]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.