Boost logo

Boost Users :

From: Robert Ramey (ramey_at_[hidden])
Date: 2007-08-21 17:06:03


Dominick Layfield wrote:
>>>> Obviously, I can just switch to a different serialization library
>>>> (e.g. s11n).
>>
>> I believe that library also has serialization of pointers
>
> Darn it! Foiled at every turn! :-)
>
> If that is the case, maybe you might consider updating/clarifying the
> "Overview -> Other implementations" section of the docs. There you
> imply that s11n doesn't do this. (Maybe it didn't back when you
> wrote the docs.)

I went back an looked at the s11n website. The documents
weren't available online and I didn't want to download them so
in fact I don't know whether or not that system supports pointer
serialization.

>>> But as much as possible, I would like to stick with
>>>> whatever is most "standard". And as part of the Boost family, I'm
>>>> guessing that boost::serialization is top dog here. Would that be
>>>> right? Is this library included in any of the proposed C++
>>>> standards (TR2, C++0x)?
>>
>> This serialization library will never be part of any C++ standard.

> Oh. That's disappointing. Why not? Too much bureaucracy involved?

Of course that's a large part of it. Though bureacracy is too perjorative.
Any standardization effort requires a huge effort. In this case it would
be bad enough for the API. But someone would insist that standardization
cover format of the particular archives so they would be dragged in as
well. Which would make the effort gigantic. And to what benefit?

Standardization for libraries which wrap varying operating system
features whose api and implemention can vary widely has a lot
of benefits. This applies to libraries like filesystem, threading
etc.

But for standard code which which is open source
with a boost license which can be compiled on a standard
conforming compiler, the whole standardization effort offers
additional benefit for the extra work.

> Let me ask another newbie question, about how to get data in and out
> of an archive. I have to work with legacy C-based code that
> delivers/accepts data in a char* buffer. My code to serialize data
> into and out of this buffer is both convoluted and inefficient. It
> looks something like this:
>
> my_class mc;
>
> void read_from_cbuffer(const char* buf, const size_t buf_sz) {
> std::string buf_str(buf, buf_sz);
> std::istringstream iss(buf_str);
> boost::archive::text_iarchive ia(iss);
> ia >> mc;
> }

>
> void write_to_cbuffer(char** buf_p, size_t* buf_sz_p) {
> std::ostringstream oss;
> boost::archive::text_oarchive oa(oss);
> oa << mc;
> *buf_p = new char[oss.str().size()];
> memcpy(*buf_p, oss.str().c_str(), oss.str().size());
> *buf_sz_p = oss.str().size();
> }
>
> Any suggestions about how this can be done better?

The real easy way is just to use a binary_object which saves/loads a
specified number of bytes.
so the above would look like:

void write_to_cbuffer(char* buf_p, size_t* buf_sz_p) { // note only one *
    std::ostringstream oss;
    boost::archive::text_oarchive oa(oss);
    oa << binary_object(bf_sz_p, mc);
}
void read_from_cbuffer(const char* buf, const size_t buf_sz) {
    std::istringstream iss(buf_str);
    boost::archive::text_iarchive ia(iss);
    ia >> binary_object(buf_sz, buf)
}

Of course you wouldn't get things like locale/character set transformation
that you can get with other i/o but this is faster and most don't need it.

Robert Ramey


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net