|
Boost Users : |
From: Robert S. Grimes (rsgrimes_at_[hidden])
Date: 2006-03-13 14:38:31
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;
}
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net