Advertisement

Boost serialization exception problems

Started by August 06, 2014 01:16 AM
1 comment, last by chiranjivi 10 years, 5 months ago

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:

1rVHgib.png

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.

I have limited experience with boost::serialization but I would probably start by reducing the amount of work you do in the serialization function to home in on exactly which type is causing the issues. Once you know what exact type is causing the problems it should be much easier to figure out what goes wrong.
Advertisement

I have limited experience with boost::serialization but I would probably start by reducing the amount of work you do in the serialization function to home in on exactly which type is causing the issues. Once you know what exact type is causing the problems it should be much easier to figure out what goes wrong.

Thanks for the advice - I did this and apparently it was one of the booleans that was causing the problem (the exception code had me looking in all the wrong places!).

My tile factory function creates a Tile object and then sets all its variables depending on what type of tile it is; due to an oversight I was apparently setting a bool to an uninitialised value, and though it wasn't causing any ingame problems, Boost didn't like trying to serialize it. I'm still a bit confused about why it was throwing that particular exception code but all's well that ends well.

This topic is closed to new replies.

Advertisement