Hi all, I'm trying to implement serialization, using boost, into a new game. To start, I built a small tester app with a main object which contained a vector of pointers to sub-objects, and everything worked fine; I could save and load states of the main object and all containers and such, no problem.
Moving on, I tried to implement something similar in my current project. The object I am trying to serialize is a Level; it contains a bunch of assorted variables, and an array of Tile objects representing the map. I added serialize functions to the class declarations as follows:
class Level {
public:
Level (int _y, int _x);
Tile tmap[256][256];
int AREA_W, AREA_H;
// ...functions removed for clarity
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version) {
ar & AREA_H;
ar & AREA_W;
ar & tmap;
}
};
class Tile {
public:
Tile ();
int ac, rot, lmap[4];
bool w, s, l, b, a, c;
string tc, name;
// ...functions removed for clarity
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version) {
ar & ac;
ar & rot;
ar & lmap;
ar & w;
ar & s;
ar & l;
ar & b;
ar & a;
ar & c;
ar & tc;
ar & name;
}
};
However, If I actually try to deserialize the Level object while the app is running (serializing works fine as far as I can tell from looking at the output file), I get this rather intimidating call stack:
I don't know what I've done wrong as serializing simple types like this seems pretty standard? If I catch the exception that Boost throws and examine it:
std::ifstream ifs("savegame1.sav");
boost::archive::text_iarchive ia(ifs);
try {
// blah
} catch (const boost::archive::archive_exception e) {
cout << "boost::archive exception code is "<< e.code << endl;
}
...I get the console output boost::archive exception code is 8. This confuses me a bit, because according to the boost docs (http://www.boost.org/doc/libs/1_54_0/libs/serialization/doc/exceptions.html), exception code enum 8 is...
unregistered_cast, // base - derived relationship not registered with
// void_cast_register
... and I'm not serializing or deserializing any derived objects.
I would welcome any help as I am pretty lost. Thanks in advance.