
Ah, yes, that makes much sense! I think now I am no longer uneasy, now that I understand the issue. And such as simple answer, too! Thanks!!!
-----Original Message----- From: boost-users-bounces@lists.boost.org [mailto:boost-users-bounces@lists.boost.org]On Behalf Of Robert Ramey Sent: Monday, March 13, 2006 9:38 PM To: boost-users@lists.boost.org Subject: Re: [Boost-users] [serialization] Problem writing and reading insameblock, with work-around
I suspect this is an issue related to the closing and flushing of file streams.
Without yuor {} the output archive and stream aren't getting flushed and closed.
So in an example like this you have to use the brackets to be sure that the appropriate destructors get called.
Robert Ramey
Robert S. Grimes wrote:
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
#include 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; }
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users