
Hi all, It seems there is a problem with using both an output and an input archive in the same code block. Here is a simple sample that illustrates the problem. By defining the symbol BREAK_IT, you can see the problem; not defining it, the example works. What is particularly odd is that it is throwing an std::bad_alloc from within text_iarchive_impl<Archive>::load(std::string &s) in text_iarchive_impl.ipp because the requested size is obviously wrong - for example, 3435973837!!! I can't follow well enough what is happening, but I have figured out a work-around from noticing the differences between my example and demo.cpp; in the latter, the writing and reading of an archive are performed in two separate functions, or more precisely, two different blocks. Is this normal? Have I missed the documentation about this? Still, seems rather fussy, though to be honest, I'm not likely to suffer from the workaround in "production" code, but it's a bit unnerving nonetheless... Thanks! -Bob Example follows: #include <fstream> #include <iostream> #include <string> #include <boost/archive/text_iarchive.hpp> #include <boost/archive/text_oarchive.hpp> class Simple { private: int anIntMember; bool aBoolMember; template<class Archive> void serialize(Archive & ar, const unsigned int file_version) { ar & BOOST_SERIALIZATION_NVP(anIntMember) & BOOST_SERIALIZATION_NVP(aBoolMember); } // Grant access to serialization library friend class boost::serialization::access; public: Simple(): anIntMember(27), aBoolMember(false) {} int GetAnIntMember() const { return anIntMember; } void SetAnIntMember(int v) { anIntMember = v; } bool GetABoolMember() const { return aBoolMember; } void SetABoolMember(bool v) { aBoolMember = v; } }; #define BREAK_IT void TestBoostText(const Simple& parms) { #ifndef BREAK_IT { #endif // Write out to boost archive std::ofstream ofs("./boost.txt"); boost::archive::text_oarchive oa(ofs); oa << parms; /// Could use a better XML element name #ifndef BREAK_IT } #endif // Read it back and check Simple rparms; std::ifstream ifs("./boost.txt"); // THIS IS THE BROKEN LINE boost::archive::text_iarchive ia(ifs); ia >> rparms; std::cout << "Checking boost read..."; if (rparms.GetAnIntMember() == 99) { std::cout << "Worked!!!" << std::endl; } else { std::cout << "Failed - appears not to have been updated" << std::endl; } } int main(int argc, char* argv[]) { Simple parms; // Modify parms for testing purposes parms.SetAnIntMember(99); // Test both binary archives TestBoostText(parms); return 0; }