|
Boost : |
From: Neal D. Becker (ndbecker2_at_[hidden])
Date: 2004-11-12 14:42:45
George van den Driessche wrote:
>> Message: 4
>> Date: Fri, 12 Nov 2004 07:34:27 -0500
>> From: "Neal D. Becker" <ndbecker2_at_[hidden]>
>> Subject: [boost] Re: Generalised reflection
>> To: boost_at_[hidden]
>> Message-ID: <cn2akj$qij$1_at_[hidden]>
>> Content-Type: text/plain; charset=us-ascii
>>
>> George van den Driessche wrote:
>>
>> [...]
>> > Yes. Now imagine that I've got some helper functions for use with
>> > Boost.Python's pickling suite. But I want to use them with a C++
>> > serialisation library. I'm going to have to factor a bunch of code out
> of
>> > those helper functions so that I can invoke them without using
>> > boost::python::tuple, and then write wrappers to use the factored-out
> code
>> > with the Boost.Python pickling suite. Instead, I want to write just the
>> > C++ serialisation code, and have that automatically wrapped up for use
>> > with Boost.Python pickling. It's a similar separation of layers.
>> >
>>
>> Incidentally, I wrote about sharing boost c++ serialization with
>> boost.python pickling, and posted code demonstrating this. Nobody seemed
>> very interested.
> I think it's this post:
> http://tinyurl.com/6dbhb
> that you're referring to. In which case, I missed it, but yes, you're on
> the same topic.
>
That is an earlier and uglier version. I played with a few approaches. The
one I settled on is very simple and easy. It does suffer from being
serialized twice - once by boost::serialize and again by python pickle, but
in my case that's a good tradeoff for simplicity.
Here is the current code I'm using:
(I'm just extracting the part that relates to serialization):
struct mt_pickle_suite : python::pickle_suite {
static python::object getstate (rng_t& rng) {
std::ostringstream os;
boost::archive::binary_oarchive oa(os);
oa << rng;
return python::str (os.str());
}
static void
setstate(rng_t& rng, python::object entries) {
python::str s = python::extract<python::str> (entries)();
std::string st = python::extract<std::string> (s)();
std::istringstream is (st);
boost::archive::binary_iarchive ia (is);
ia >> rng;
}
};
[...]
class_<rng_t> ("rng", "Mersenne Twister",
python::init<rng_t::result_type>(
(python::arg ("seed")=4357),
"__init__(seed=4357)\n"
"Construct with optional seed\n"
"@param seed: initial seed\n"
))
.def_pickle(mt_pickle_suite())
.def ("getstate", &mt_pickle_suite::getstate)
.def ("setstate", &mt_pickle_suite::setstate)
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk