Boost logo

Boost Users :

Subject: [Boost-users] Serialize a class, call new() in constructor
From: Michael Reichlin (Michael.Reichlin_at_[hidden])
Date: 2010-10-05 08:57:34


Hi everybody,

actually i have a big problem with serializing some of my classes. The
problem is, that classA class calls new of classB in constructor and
after that the load_construct_data is called and also calls a new of
classB. So I have two objects of classB.

Here is my code:

classA.h:

    class CClassA
    {
         template<class Archive> friend
         void serialize(Archive &ar, CClassA &cCClassA, const unsigned
int version);

         template<class Archive> friend
         void save_construct_data(Archive &ar, const CClassA *cCClassA,
const unsigned int version);
         template<class Archive> friend
         void load_construct_data(Archive &ar, CClassA *cCClassA, const
unsigned int version);

         // *** Aufzählungen
****************************************************************************

      public:
         CClassB* pClassB;

         // *** Methoden
********************************************************************************
      private:

      protected:
         int iTest;
      public:
         CClassA(int iTest); //
Konstruktor
         virtual ~CClassA(); // Destruktor

         // Get/Set-Methoden

      };

classA.cpp:

CClassA::CClassA(int iTest)
:iTest(iTest)
{
   pClassB = new CClassB(iTest);
}

classB.h:

      class CClassB
      {
         template<class Archive> friend
         void serialize(Archive &ar, CClassB &cCClassB, const unsigned
int version);

         template<class Archive> friend
         void save_construct_data(Archive &ar, const CClassB *cCClassB,
const unsigned int version);
         template<class Archive> friend
         void load_construct_data(Archive &ar, CClassB *cCClassB, const
unsigned int version);

         // *** Aufzählungen
****************************************************************************
      public:

         // *** Datenmember
*****************************************************************************
      private:

      protected:

      public:

         // *** Methoden
********************************************************************************
      private:

      protected:
         int iTestInt;
      public:
         CClassB(int iTest); //
Konstruktor
         virtual ~CClassB(); // Destruktor

         // Get/Set-Methoden
         static unsigned int count;

      };

serialize.h
      template<class Archive>
      void serialize(Archive &ar, CClassA &cCClassA, const unsigned int
version)
      {
         ar & boost::serialization::make_nvp("ClassB", cCClassA.pClassB
);
      }
      
      template<class Archive>
      void save_construct_data(Archive &ar, const CClassA *cCClassA,
const unsigned int version)
      {
         ar << boost::serialization::make_nvp("Test",
cCClassA->iTest);
      }
      template<class Archive>
      void load_construct_data(Archive &ar, CClassA *cCClassA, const
unsigned int version)
      {
         int iTest;
         ar >> boost::serialization::make_nvp("Test", iTest);
         ::new(cCClassA) CClassA(iTest);
      }

      template<class Archive>
      void serialize(Archive &ar, CClassB &cCClassB, const unsigned int
version)
      {
      }
      
      template<class Archive>
      void save_construct_data(Archive &ar, const CClassB *cCClassB,
const unsigned int version)
      {
         ar << boost::serialization::make_nvp("Test",
cCClassB->iTestInt);
      }
      template<class Archive>
      void load_construct_data(Archive &ar, CClassB *cCClassB, const
unsigned int version)
      {
         int iTest;
         ar >> boost::serialization::make_nvp("Test", iTest);
         ::new(cCClassB) CClassB(iTest);
      }

Now I just want that only one ClassB will be created. How can I
recognize, that ClassB is already generate through cons
tructor classA. I
just want to serialize the members of classB.

Is there a way to solve my problem??

Best regards
Michael


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