Jump to content

  • Log In with Google      Sign In   
  • Create Account

Banner advertising on our site currently available from just $5!


1. Learn about the promo. 2. Sign up for GDNet+. 3. Set up your advert!


Boost serialization exception problems


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1 chiranjivi   Members   -  Reputation: 197

Like
0Likes
Like

Posted 05 August 2014 - 07:16 PM

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.


Edited by chiranjivi, 05 August 2014 - 07:19 PM.


Sponsor:

#2 BitMaster   Crossbones+   -  Reputation: 5725

Like
1Likes
Like

Posted 06 August 2014 - 03:10 AM

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.

#3 chiranjivi   Members   -  Reputation: 197

Like
0Likes
Like

Posted 06 August 2014 - 09:49 AM

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.


Edited by chiranjivi, 06 August 2014 - 09:50 AM.





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS