Frank Birbacher wrote:
Hi!
Robert Ramey schrieb:
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) }
You got this one mixed up. The char array is not something to serailize but it is the storage to searialize to. The "read_from_cbuffer" function does *read* the cbuffer and construct a my_class instance out of it by using serialization. The "write_to_cbuffer" serializes a my_class instance an stores the result in the cbuffer.
I can think of using the old strstream class to read from the buffer or take something from Boost.IOStreams. And writing could be faster if you use a std::deque wrapped with IOStreams and later on std::copy this into a char array (instead of memcpy). A deque has usually better performance on push_back than a vector or string, I guess. But then I don't know the internals of a stringstream.
I've used boost::IOStreams to do exactly this, for both over the wire transmission and using the Windows clipboard for cut/paste drag/drop operations. Jeff Flinn