
On Sat, April 10, 2010, Robert Ramey wrote:
Just look at boost/serialization/string.hpp and do the same thing for unsigned char
Yes, that was my first thought, too. Consider the code below. Execution fails with this assertion: a.out: test.cc:47: void load(): Assertion `size == 10' failed. Aborted I also tried the collection-based approach which is currently commented out in serialization/string.hpp, but this does not compile since basic_string<> does not have a back() method. -------------------- SNIP ----------------------- #include <string> #include <fstream> #include <cassert> #include <boost/archive/binary_oarchive.hpp> #include <boost/archive/binary_iarchive.hpp> BOOST_CLASS_IMPLEMENTATION(std::basic_string<unsigned char>, boost::serialization::primitive_type) #define SIZE 10 #define FNAME "/tmp/archive.ser" class A { public: std::basic_string<unsigned char> m_string; private: friend class boost::serialization::access; template<class Archive> void serialize (Archive & ar, const unsigned int version) { ar & m_string; } }; void save (void) { A a; a.m_string.assign (SIZE, (unsigned char)0); for (int i = 0; i < SIZE; ++i) { a.m_string[i] = (unsigned char)i; } std::ofstream ofs (FNAME, std::ios::out | std::ios::binary); boost::archive::binary_oarchive oa (ofs); oa << a; } void load (void) { A b; std::ifstream ifs (FNAME, std::ios::in | std::ios::binary); boost::archive::binary_iarchive ia (ifs); ia >> b; size_t size = b.m_string.size (); assert (size == SIZE); for (int i = 0; i < b.m_string.size (); ++i) { assert ((int)b.m_string[i] == i); } } int main (void) { save (); load (); return 0; } -------------------- SNIP ----------------------- Cheers, M'bert -- ----------- / http://herbert.the-little-red-haired-girl.org / ------------- =+= while (!asleep) ++sheep;