Boost logo

Boost Users :

Subject: [Boost-users] unlocatable infinite loop when using boost::serialization
From: Griffin Howlett (griff.howl_at_[hidden])
Date: 2011-08-10 00:14:07


Ok so i've set up boost::serialization to work with objects whose
constructor and destructors are private (forcing you to make them through
"factories"), but after doing the coming steps, the << operator of a
boost::oarchive never returns.

I've followed what was happening exactly in a debugger, but don't know
what's happening *after the ending brackets of the object's serialization
function. It's not even reaching the overloaded destroy function*. I think
it's some internal business.

 - To do this i've overided the `load/save_construct_data function` and
   the `access::destroy template function` with the appropriate
   parameters.

 - I also defined a serialization function for each factory-built
   object, but it doesn't do anything as to force you to pass a pointer
   instead.

 - You'll also notice i've added my own Save() function as so the user
   can specify a different factory to use for recreating (loading) the
   object back up if needed.

**Why would this be happening and how do i fix it?**

here's the source:

            oa << WallBody2; //this is the call in main, wallBody2 is a
b2Body*

        template<>
         static void access::destroy( const b2Body * t) // const appropriate
here?
         {
          // the const business is an MSVC 6.0 hack that should be
          // benign on everything else

  const_cast<b2Body*>(t)->GetWorld()->DestroyBody(const_cast<b2Body*>(t));
         }

        template<>
         static void access::destroy( const b2Fixture * t) // const
appropriate here?
         {
          // the const business is an MSVC 6.0 hack that should be
          // benign on everything else

  const_cast<b2Fixture*>(t)->GetBody()->DestroyFixture(const_cast<b2Fixture*>(t));
         }

    template<class Archive>
     inline void save_construct_data( Archive & ar, const b2Body * t, const
unsigned int file_version)
     {
      // save data required to construct instance
      b2World* WorldPtr= const_cast<b2Body*>(t)->GetWorld();
      ar & WorldPtr;

      Save(ar, const_cast<b2Body*>(t), file_version);
     }

            template<class Archive>
             inline void save_construct_data( Archive & ar, const b2Fixture
* t, const unsigned int file_version)
             {
              // save data required to construct instance
              b2Body* BodyPtr= const_cast<b2Fixture*>(t)->GetBody();
              ar & BodyPtr;

              Save(ar, const_cast<b2Fixture*>(t), file_version);
             }

            template<class Archive>
             void serialize(Archive & ar, b2Fixture& b2, const unsigned int
version)
             { std::cout << "b2Fixture is not serializable, only b2Fixture
pointers are" << std::endl;};

            template<class Archive>
             void serialize(Archive & ar, b2Body& b2, const unsigned int
version)
             { std::cout << "b2Fixture is not serializable, only b2Fixture
pointers are" << std::endl;};

            template<class Archive>
             void Save(Archive & ar, b2Body* b2, const unsigned int version)
             {
              b2World* World = b2->GetWorld();
              ar & World;

              b2BodyDef InitialBodyDef;
               InitialBodyDef.inertiaScale= b2->GetInertia(); //
QUESTION: Is there any way to get/set this from a body (not def)
              ar & InitialBodyDef; // QUESTION: wtf is
inertiaScale? any relation to MassData?

              b2BodyDef BodyDef;
               BodyDef.angle= b2->GetAngle();
               BodyDef.position= b2->GetPosition();
               BodyDef.active= b2->IsActive();
               BodyDef.angularDamping= b2->GetAngularDamping();
               BodyDef.angularVelocity= b2->GetAngularVelocity();
               BodyDef.awake= b2->IsAwake();
               BodyDef.bullet= b2->IsBullet();
               BodyDef.fixedRotation= b2->IsFixedRotation();
               BodyDef.linearDamping= b2->GetLinearDamping();
               BodyDef.linearVelocity= b2->GetLinearVelocity();
               BodyDef.type= b2->GetType();
               BodyDef.userData= b2->GetUserData();
              ar & BodyDef;

              // number of fixtures saved first so when loaded we know
              // how many fixturedefs to extract
              unsigned int numbFixtures=0;
              for (b2Fixture* fixture = b2->GetFixtureList(); fixture;
fixture = fixture->GetNext())
               numbFixtures++;
              ar & numbFixtures; //TODO: find out if boost will detect
this as a list

              for (b2Fixture* fixture = b2->GetFixtureList(); fixture;
fixture = fixture->GetNext())
               ar & fixture;
             }

            template<class Archive>
             void Save(Archive & ar, b2Fixture* b2, const unsigned int
version)
             {
              b2Body* Body = b2->GetBody();
              ar & Body;

              //Registered so boost can differentiate types of "shapes"
              ar.register_type(static_cast<b2CircleShape *>(NULL));
              ar.register_type(static_cast<b2PolygonShape *>(NULL));

              b2Shape* Shape= b2->GetShape();
              ar & Shape;

              b2FixtureDef FixtureDef;
               FixtureDef.density= b2->GetDensity();
               FixtureDef.filter= b2->GetFilterData();
               FixtureDef.friction= b2->GetFriction();
               FixtureDef.isSensor= b2->IsSensor();
               FixtureDef.restitution= b2->GetRestitution();
               FixtureDef.userData= b2->GetUserData();
              ar & FixtureDef;
             }



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