2011-09-02 3 views
4

J'ai une bibliothèque C++ qui utilise Boost.Serialization. Je crée des liaisons Python pour cette bibliothèque en utilisant Boost.Python. Il est assez clair comment faire une suite pickle pour Boost.Python qui utilise Boost.Serialization (enregistrer dans une chaîne en utilisant Boost.Serialization, et retourner cette chaîne à Python).Boost.Serialization et Boost.Python pickle bidirectionnel

Ce que je veux est l'inverse: étant donné un boost::python::object, je veux avoir une fonction serialize(...) qui appeler la fonction pickle.dumps() Python et sérialiser la chaîne résultante. (Imaginez un std::vector<boost::python::object>. Comme je sérialiser ce vecteur, Boost.Serialization appellerait la fonction auxiliaire serialize()). Est-ce possible? Mieux encore, est-il possible d'utiliser cPickle et de contourner donnant le contrôle à l'interpréteur Python?

+0

Avez-vous trouvé une solution? J'ai le même problème maintenant. Je pense que la définition d'un espace de nommage boost {namespace sérialisation {template void sérialiser (Archive & a, boost :: python :: objet & obj, const version non signée) {/*...*/; }}} 'devrait faire l'affaire, mais avant d'essayer ... Merci! – eudoxos

+0

Pour moi, le plus gros problème était de savoir comment utiliser le module pickle lui-même. Vous pouvez l'importer en utilisant boost :: python :: import. J'ai finalement opté pour une solution différente à mon problème spécifique qui n'a pas impliqué cette question. La configuration de la fonction boost :: serialization :: serialize() devrait fonctionner exactement comme vous le décrivez. – foxcub

Répondre

0

Voici le code que j'utilise pour instance cornichon/unpickle de 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; 
    } 
}; 
+0

C'est la mauvaise façon; Je comprends comment décaper une classe C++ à travers une chaîne de caractères. Je veux l'inverse: utilisez bp :: object dans Boost.Serialization (en utilisant le pickle de Python). – foxcub