Hello !
I am trying to serialize a a complex structure. One of the "variable" is a 2D Array (Cell** m_cells ) declared with pointers. I need to keep this data structure as it is.
I have read some stuff about multi array with boost but found nothing to serialize my Cell** m_cells.
Maybe one of you has the solution ....
Note1: using boost 1.41.0, g++ and ubuntu 9.04 ....
Note2: As you may understand while reading the code, I have in fact an Array2D of PointAccumulator .... (Cell = PointAccumulator)
The part of code that is not correct .....
template <class Archive> void serialize(Archive& ar, const unsigned int version){
ar & m_xsize & m_ysize & m_cells;
}
And raising this error:
wheelchair@wheelchair-laptop:~/playerstage/boostTest$ g++ -I/usr/local/include/ -L/usr/local/lib/ simple2.cpp -o simple -lboost_serialization
/usr/local/include/boost/serialization/access.hpp: In static member function ‘static void boost::serialization::access::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_iarchive, T = PointAccumulator*]’:
/usr/local/include/boost/serialization/serialization.hpp:74: instantiated from ‘void boost::serialization::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_iarchive, T = PointAccumulator*]’
/usr/local/include/boost/serialization/serialization.hpp:133: instantiated from ‘void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::archive::text_iarchive, T = PointAccumulator*]’
/usr/local/include/boost/archive/detail/iserializer.hpp:173: instantiated from ‘void boost::archive::detail::iserializer<Archive, T>::load_object_data(boost::archive::detail::basic_iarchive&, void*, unsigned int) const [with Archive = boost::archive::text_iarchive, T = PointAccumulator*]’
simple2.cpp:186: instantiated from here
/usr/local/include/boost/serialization/access.hpp:109: error: request for member ‘serialize’ in ‘t’, which is of non-class type ‘PointAccumulator*’
/usr/local/include/boost/serialization/access.hpp: In static member function ‘static void boost::serialization::access::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive, T = PointAccumulator*]’:
/usr/local/include/boost/serialization/serialization.hpp:74: instantiated from ‘void boost::serialization::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive, T = PointAccumulator*]’
/usr/local/include/boost/serialization/serialization.hpp:133: instantiated from ‘void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive, T = PointAccumulator*]’
/usr/local/include/boost/archive/detail/oserializer.hpp:139: instantiated from ‘void boost::archive::detail::oserializer<Archive, T>::save_object_data(boost::archive::detail::basic_oarchive&, const void*) const [with Archive = boost::archive::text_oarchive, T = PointAccumulator*]’
simple2.cpp:186: instantiated from here
/usr/local/include/boost/serialization/access.hpp:109: error: request for member ‘serialize’ in ‘t’, which is of non-class type ‘PointAccumulator*’
Here is the code I use for my tests:
#include <iostream>
#include <iterator>
#include <algorithm>
#include <sstream>
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
using namespace std;
using namespace boost::archive;
using namespace boost::serialization;
/*
* point
*
*/
template <class T> struct point{
inline point():x(0),y(0) {}
inline point(T _x, T _y):x(_x),y(_y){}
T x, y;
friend class boost::serialization::access;
template <class Archive>
void serialize(Archive& ar, const unsigned int version){
ar & x & y;
}
};
/*
* PointAccumulator
*
*/
struct PointAccumulator{
typedef point<float> FloatPoint;
PointAccumulator(): acc(0,0), n(0), visits(0){}
PointAccumulator(int i): acc(0,0), n(0), visits(0){assert(i==-1);}
static PointAccumulator* unknown_ptr;
FloatPoint acc;
int n, visits;
friend class boost::serialization::access;
template <class Archive> void serialize(Archive& ar, const unsigned int version){
ar & n & visits & acc;
}
};
/*
* Array2D
*
*/
template<class Cell, const bool debug=false> class Array2D{
public:
Array2D(int xsize=0, int ysize=0);
Array2D& operator=(const Array2D &);
Array2D(const Array2D<Cell,debug> &);
//~Array2D();
inline Cell& cell(int x, int y);
inline void print(){
cout << "Displaying array2D (x,y) --> (" << m_xsize << "," << m_ysize << ")" << endl;
for(int i=0;i<m_xsize;i++){
for(int j=0;j<m_ysize;j++){
cout << cell(i,j).acc.x << " ";
}
cout<<endl;
}
}
Cell ** m_cells;
protected:
int m_xsize, m_ysize;
friend class boost::serialization::access;
template <class Archive> void serialize(Archive& ar, const unsigned int version){
ar & m_xsize & m_ysize & m_cells;
}
};
template <class Cell, const bool debug>
Array2D<Cell,debug> & Array2D<Cell,debug>::operator=(const Array2D<Cell,debug> & g){
if (debug || m_xsize!=g.m_xsize || m_ysize!=g.m_ysize){
for (int i=0; i<m_xsize; i++)
delete [] m_cells[i];
delete [] m_cells;
m_xsize=g.m_xsize;
m_ysize=g.m_ysize;
m_cells=new Cell*[m_xsize];
for (int i=0; i<m_xsize; i++)
m_cells[i]=new Cell[m_ysize];
}
for (int x=0; x<m_xsize; x++)
for (int y=0; y<m_ysize; y++)
m_cells[x][y]=g.m_cells[x][y];
if (debug){
std::cerr << __PRETTY_FUNCTION__ << std::endl;
std::cerr << "m_xsize= " << m_xsize<< std::endl;
std::cerr << "m_ysize= " << m_ysize<< std::endl;
}
return *this;
}
template <class Cell, const bool debug>
Array2D<Cell,debug>::Array2D(int xsize, int ysize){
// assert(xsize>0);
// assert(ysize>0);
m_xsize=xsize;
m_ysize=ysize;
if (m_xsize>0 && m_ysize>0){
m_cells=new Cell*[m_xsize];
for (int i=0; i<m_xsize; i++)
m_cells[i]=new Cell[m_ysize];
}
else{
m_xsize=m_ysize=0;
m_cells=0;
}
if (debug){
std::cerr << __PRETTY_FUNCTION__ << std::endl;
std::cerr << "m_xsize= " << m_xsize<< std::endl;
std::cerr << "m_ysize= " << m_ysize<< std::endl;
}
}
template <class Cell, const bool debug>
inline Cell& Array2D<Cell,debug>::cell(int x, int y){
return m_cells[x][y];
}
template <class Cell, const bool debug>
Array2D<Cell,debug>::Array2D(const Array2D<Cell,debug> & g){
m_xsize=g.m_xsize;
m_ysize=g.m_ysize;
m_cells=new Cell*[m_xsize];
for (int x=0; x<m_xsize; x++){
m_cells[x]=new Cell[m_ysize];
for (int y=0; y<m_ysize; y++)
m_cells[x][y]=g.m_cells[x][y];
}
if (debug){
std::cerr << __PRETTY_FUNCTION__ << std::endl;
std::cerr << "m_xsize= " << m_xsize<< std::endl;
std::cerr << "m_ysize= " << m_ysize<< std::endl;
}
}
/*
* SaveToFile and LoadFromFile
*
*/
template <class A> void saveIntoFile(Array2D<PointAccumulator,false>& array, const char* file){
ofstream ofile(file);
A ar(ofile);
ar << array;
ofile.close();
}
template <class A> Array2D<PointAccumulator,false> loadFromFile(const char* file){
ifstream ifile(file);
A ar(ifile);
Array2D<PointAccumulator,false> array;
ar >> array;
ifile.close();
return array;
}
/*
* MAIN
*
*/
int main(){
Array2D<PointAccumulator,false> myArr = Array2D<PointAccumulator,false>(2,2);
myArr.cell(0,0).acc.x = 1;
myArr.cell(1,0).acc.x = 2;
myArr.cell(0,1).acc.x = 1.1;
myArr.cell(1,1).acc.x = 2.2;
myArr.print();
saveIntoFile<text_oarchive>(myArr,"out.txt");
Array2D<PointAccumulator,false> myArr2 = loadFromFile<text_iarchive>("out.txt");
myArr2.print();
}
Thanks for the help !