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::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::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
#include
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 Array2D{
public:
Array2D(int xsize=0, int ysize=0);
Array2D& operator=(const Array2D &);
Array2D(const Array2D &);
//~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
Array2D & Array2D::operator=(const
Array2D & g){
if (debug || m_xsize!=g.m_xsize || m_ysize!=g.m_ysize){
for (int i=0; i
Array2D::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
inline Cell& Array2D::cell(int x, int y){
return m_cells[x][y];
}
template
Array2D::Array2D(const Array2D & g){
m_xsize=g.m_xsize;
m_ysize=g.m_ysize;
m_cells=new Cell*[m_xsize];
for (int x=0; x& array,
const char* file){
ofstream ofile(file);
A ar(ofile);
ar << array;
ofile.close();
}
template <class A> Array2D loadFromFile(const char*
file){
ifstream ifile(file);
A ar(ifile);
Array2D array;
ar >> array;
ifile.close();
return array;
}
/*
* MAIN
*
*/
int main(){
Array2D myArr =
Array2D(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(myArr,"out.txt");
Array2D myArr2 =
loadFromFile("out.txt");
myArr2.print();
}
Thanks for the help ! | | | | | | | |