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