2011-09-02 29 views
4

我有一個使用Boost.Serialization的C++庫。我正在使用Boost.Python爲這個庫創建Python綁定。很明顯,如何爲Boost.Python製作一個使用Boost.Serialization的pickle套件(使用Boost.Serialization保存爲字符串,並將該字符串返回給Python)。Boost.Serialization和Boost.Python雙向pickle

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

+0

你已經找到了解決?我現在有同樣的問題。我認爲定義了一個'命名空間boost {命名空間序列化{模板 void serialize(Archive&a,boost :: python :: object&obj,const unsigned version){/*...*/; }}}'應該這樣做,但在我嘗試之前...謝謝! – eudoxos

+0

對我來說,更大的問題是如何使用泡菜模塊本身。你可以使用boost :: python :: import導入它。我最終選擇了一個不涉及這個問題的具體問題的不同解決方案。 boost :: serialization :: serialize()函數的設置應該和你描述的完全一樣。 – foxcub

回答

0

下面是代碼我用泡菜/ unpickle提升的情況下:: 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; 
    } 
}; 
+0

這是錯誤的方法;我明白如何通過stringstream來醃製C++類。我想要另一種方式:在Boost.Serialization中使用bp :: object(使用Python的pickle)。 – foxcub