Boost logo

Boost Users :

From: Ivan Rachev (ivanr_at_[hidden])
Date: 2005-07-09 17:56:00


Does anyone have an idea how to serialize dynamic arrays of objects?

An example follows at the end. Its weakness shows up when an outside
pointer points to an element in the array. The problem is that the type
being serialized is T but not T*.

Thanks,
Ivan

#include <fstream>

#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/access.hpp>
#include <boost/serialization/split_member.hpp>

class A
{ friend class boost::serialization::access;
   template<class Archive>
   void serialize(Archive & ar, const unsigned int version) {}
};

//IVAN Element always points to the beginning of an array of
// 'Size' elements. The array is NOT null-terminated. If
// size == 0, Elements may hold an undefined value. User
// is responsible for initializing, new-ing and delete-ing.
// Assumption: if there is an outside pointer to an object
// inside this array, after loading the array
// that pointer will hold a different object.
template <typename T>
struct DynamicArray
{
   int Size;
   T* Element;

   friend class boost::serialization::access;
   template<class Archive>
   void save(Archive & ar, const unsigned int version) const
   {
     ar & Size;
     for (int i = 0; i < Size; ++i)
       ar & Element[i];
   }
   template<class Archive>
   void load(Archive & ar, const unsigned int version)
   {
     ar & Size;
     //TODO: assert(Size >=0);
     if (Size > 0)
       {
       Element = new T[Size];
       for (int i = 0; i < Size; ++i)
         ar & Element[i];
       }
   }
   BOOST_SERIALIZATION_SPLIT_MEMBER()
};

int main()
{
   DynamicArray<A> ArrayOfAs;
   A* secondElement;

   std::ifstream ifs("test.txt");
   boost::archive::text_iarchive ia(ifs);
   ia & ArrayOfAs;
   ia & secondElement; // this guy will point to a copy of the
                       // 2nd element but NOT the 2nd element itself

   delete [] ArrayOfAs.Element;
}


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