Hello again !
 
I am continuing my structure serialization ...
Seems I do not get something with pointers ... I have followed the "demo.cpp" example and tried to do the same as they are doing for pointers but I get an exception when trying to relaod my structure !
 
Hope someone can help me ....
 
What I do:
-Save a Particle structure.
    - this particle contains a SensoRreading class
        -this sensorReading has a pointer to a Sensor class (only containing a string)
 
When I save(serialize) the particle, the file "out.txt" contains the following text:
22 serialization::archive 6 0 0 0 0 1.1000000000000001 4.4000000000000004 0 2.1000000000000001 8.4000000000000004 0 3 12.699999999999999 8.5 6 0 0 35 3 1 0 0 11 Sensor Name
 
This seems correct to me !
 
But when I try to load it back in a particle using
 
    Particle p2 = Particle();
    loadFromFile<text_iarchive>(p2, "out.txt");
 
It raises the follwoing error during compilation:
 
wheelchair@wheelchair-laptop:~/playerstage/boostTest$ g++ simple_RangeReading.cpp -o simple -lboost_serialization
/usr/local/include/boost/archive/detail/iserializer.hpp: In static member function ‘static void boost::archive::detail::load_pointer_type<Archive>::invoke(Archive&, Tptr&) [with Tptr = const Sensor*, Archive = boost::archive::text_iarchive]’:
/usr/local/include/boost/archive/detail/iserializer.hpp:554:   instantiated from ‘void boost::archive::load(Archive&, T&) [with Archive = boost::archive::text_iarchive, T = const Sensor*]’
/usr/local/include/boost/archive/detail/common_iarchive.hpp:61:   instantiated from ‘void boost::archive::detail::common_iarchive<Archive>::load_override(T&, int) [with T = const Sensor*, Archive = boost::archive::text_iarchive]’
/usr/local/include/boost/archive/basic_text_iarchive.hpp:62:   instantiated from ‘void boost::archive::basic_text_iarchive<Archive>::load_override(T&, int) [with T = const Sensor*, Archive = boost::archive::text_iarchive]’
/usr/local/include/boost/archive/text_iarchive.hpp:66:   instantiated from ‘void boost::archive::text_iarchive_impl<Archive>::load_override(T&, int) [with T = const Sensor*, Archive = boost::archive::text_iarchive]’
/usr/local/include/boost/archive/detail/interface_iarchive.hpp:61:   instantiated from ‘Archive& boost::archive::detail::interface_iarchive<Archive>::operator>>(T&) [with T = const Sensor*, Archive = boost::archive::text_iarchive]’
/usr/local/include/boost/archive/detail/interface_iarchive.hpp:68:   instantiated from ‘Archive& boost::archive::detail::interface_iarchive<Archive>::operator&(T&) [with T = const Sensor*, Archive = boost::archive::text_iarchive]’
simple_RangeReading.cpp:279:   instantiated from ‘void SensorReading::serialize(Archive&, unsigned int) [with Archive = boost::archive::text_iarchive]’
/usr/local/include/boost/serialization/access.hpp:109:   instantiated from ‘static void boost::serialization::access::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_iarchive, T = SensorReading]’
/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 = SensorReading]’
/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 = SensorReading]’
/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 = SensorReading]’
simple_RangeReading.cpp:424:   instantiated from here
/usr/local/include/boost/archive/detail/iserializer.hpp:486: error: reinterpret_cast from type ‘const Sensor**’ to type ‘void**’ casts away constness
/usr/local/include/boost/archive/detail/iserializer.hpp:489: error: no matching function for call to ‘boost::archive::detail::load_pointer_type<boost::archive::text_iarchive>::pointer_tweak(const boost::serialization::extended_type_info&, const Sensor*&, const Sensor&)’
/usr/local/include/boost/archive/detail/iserializer.hpp: In member function ‘void boost::archive::detail::pointer_iserializer<Archive, T>::load_object_ptr(boost::archive::detail::basic_iarchive&, void*&, unsigned int) const [with Archive = boost::archive::text_iarchive, T = const Sensor]’:
simple_RangeReading.cpp:424:   instantiated from here
/usr/local/include/boost/archive/detail/iserializer.hpp:286: error: invalid conversion from ‘const void*’ to ‘void*’
/usr/local/include/boost/archive/detail/iserializer.hpp:294: error: invalid conversion from ‘const void*’ to ‘void*’
/usr/local/include/boost/archive/detail/iserializer.hpp:294: error:   initializing argument 1 of ‘void boost::archive::detail::basic_iarchive::next_object_pointer(void*)’
/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 = const Sensor]’:
/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 = const Sensor]’
/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 = const Sensor]’
/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 = const Sensor]’
simple_RangeReading.cpp:424:   instantiated from here
/usr/local/include/boost/serialization/access.hpp:109: error: passing ‘const Sensor’ as ‘this’ argument of ‘void Sensor::serialize(Archive&, unsigned int) [with Archive = boost::archive::text_iarchive]’ discards qualifiers
/usr/local/include/boost/serialization/access.hpp: In static member function ‘static void boost::serialization::access::construct(T*) [with T = const Sensor]’:
/usr/local/include/boost/serialization/serialization.hpp:98:   instantiated from ‘void boost::serialization::load_construct_data(Archive&, T*, unsigned int) [with Archive = boost::archive::text_iarchive, T = const Sensor]’
/usr/local/include/boost/serialization/serialization.hpp:163:   instantiated from ‘void boost::serialization::load_construct_data_adl(Archive&, T*, unsigned int) [with Archive = boost::archive::text_iarchive, T = const Sensor]’
/usr/local/include/boost/archive/detail/iserializer.hpp:295:   instantiated from ‘void boost::archive::detail::pointer_iserializer<Archive, T>::load_object_ptr(boost::archive::detail::basic_iarchive&, void*&, unsigned int) const [with Archive = boost::archive::text_iarchive, T = const Sensor]’
simple_RangeReading.cpp:424:   instantiated from here
/usr/local/include/boost/serialization/access.hpp:123: error: invalid conversion from ‘const void*’ to ‘void*’
/usr/local/include/boost/serialization/access.hpp:123: error:   initializing argument 2 of ‘void* operator new(size_t, void*)’
/usr/local/include/boost/archive/detail/check.hpp: In function ‘void boost::archive::detail::check_const_loading() [with T = const Sensor]’:
/usr/local/include/boost/archive/detail/iserializer.hpp:539:   instantiated from ‘void boost::archive::load(Archive&, T&) [with Archive = boost::archive::text_iarchive, T = const Sensor]’
/usr/local/include/boost/archive/detail/common_iarchive.hpp:61:   instantiated from ‘void boost::archive::detail::common_iarchive<Archive>::load_override(T&, int) [with T = const Sensor, Archive = boost::archive::text_iarchive]’
/usr/local/include/boost/archive/basic_text_iarchive.hpp:62:   instantiated from ‘void boost::archive::basic_text_iarchive<Archive>::load_override(T&, int) [with T = const Sensor, Archive = boost::archive::text_iarchive]’
/usr/local/include/boost/archive/text_iarchive.hpp:66:   instantiated from ‘void boost::archive::text_iarchive_impl<Archive>::load_override(T&, int) [with T = const Sensor, Archive = boost::archive::text_iarchive]’
/usr/local/include/boost/archive/detail/interface_iarchive.hpp:61:   instantiated from ‘Archive& boost::archive::detail::interface_iarchive<Archive>::operator>>(T&) [with T = const Sensor, Archive = boost::archive::text_iarchive]’
/usr/local/include/boost/serialization/nvp.hpp:87:   instantiated from ‘void boost::serialization::nvp<T>::load(Archivex&, unsigned int) [with Archivex = boost::archive::text_iarchive, T = const Sensor]’
/usr/local/include/boost/serialization/access.hpp:101:   instantiated from ‘static void boost::serialization::access::member_load(Archive&, T&, unsigned int) [with Archive = boost::archive::text_iarchive, T = boost::serialization::nvp<const Sensor>]’
/usr/local/include/boost/serialization/split_member.hpp:54:   instantiated from ‘static void boost::serialization::detail::member_loader<Archive, T>::invoke(Archive&, T&, unsigned int) [with Archive = boost::archive::text_iarchive, T = boost::serialization::nvp<const Sensor>]’
/usr/local/include/boost/serialization/split_member.hpp:69:   instantiated from ‘void boost::serialization::split_member(Archive&, T&, unsigned int) [with Archive = boost::archive::text_iarchive, T = boost::serialization::nvp<const Sensor>]’
/usr/local/include/boost/serialization/nvp.hpp:89:   instantiated from ‘void boost::serialization::nvp<T>::serialize(Archive&, unsigned int) [with Archive = boost::archive::text_iarchive, T = const Sensor]’
/usr/local/include/boost/serialization/access.hpp:109:   instantiated from ‘static void boost::serialization::access::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_iarchive, T = boost::serialization::nvp<const Sensor>]’
/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 = boost::serialization::nvp<const Sensor>]’
/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 = boost::serialization::nvp<const Sensor>]’
/usr/local/include/boost/archive/detail/iserializer.hpp:349:   instantiated from ‘static void boost::archive::detail::load_non_pointer_type<Archive>::load_only::invoke(Archive&, const T&) [with T = boost::serialization::nvp<const Sensor>, Archive = boost::archive::text_iarchive]’
/usr/local/include/boost/archive/detail/iserializer.hpp:415:   instantiated from ‘static void boost::archive::detail::load_non_pointer_type<Archive>::invoke(Archive&, T&) [with T = const boost::serialization::nvp<const Sensor>, Archive = boost::archive::text_iarchive]’
/usr/local/include/boost/archive/detail/iserializer.hpp:554:   instantiated from ‘void boost::archive::load(Archive&, T&) [with Archive = boost::archive::text_iarchive, T = const boost::serialization::nvp<const Sensor>]’
/usr/local/include/boost/archive/detail/common_iarchive.hpp:61:   instantiated from ‘void boost::archive::detail::common_iarchive<Archive>::load_override(T&, int) [with T = const boost::serialization::nvp<const Sensor>, Archive = boost::archive::text_iarchive]’
/usr/local/include/boost/archive/basic_text_iarchive.hpp:62:   instantiated from ‘void boost::archive::basic_text_iarchive<Archive>::load_override(T&, int) [with T = const boost::serialization::nvp<const Sensor>, Archive = boost::archive::text_iarchive]’
/usr/local/include/boost/archive/text_iarchive.hpp:66:   instantiated from ‘void boost::archive::text_iarchive_impl<Archive>::load_override(T&, int) [with T = const boost::serialization::nvp<const Sensor>, Archive = boost::archive::text_iarchive]’
/usr/local/include/boost/archive/detail/interface_iarchive.hpp:61:   instantiated from ‘Archive& boost::archive::detail::interface_iarchive<Archive>::operator>>(T&) [with T = const boost::serialization::nvp<const Sensor>, Archive = boost::archive::text_iarchive]’
/usr/local/include/boost/archive/detail/iserializer.hpp:307:   instantiated from ‘void boost::archive::detail::pointer_iserializer<Archive, T>::load_object_ptr(boost::archive::detail::basic_iarchive&, void*&, unsigned int) const [with Archive = boost::archive::text_iarchive, T = const Sensor]’
simple_RangeReading.cpp:424:   instantiated from here
/usr/local/include/boost/archive/detail/check.hpp:162: error: invalid application of ‘sizeof’ to incomplete type ‘boost::STATIC_ASSERTION_FAILURE<false>’
/usr/local/include/boost/archive/detail/check.hpp:162: error: invalid application of ‘sizeof’ to incomplete type ‘boost::STATIC_ASSERTION_FAILURE<false>’
wheelchair@wheelchair-laptop:~/playerstage/boostTest$
 
Here is the code:
 
#include <iostream>
#include <iterator>
#include <algorithm>
#include <sstream>
#include <fstream>
 
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/string.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;
    }
};
 
/*
 * OrientedPoint
 *
 */
template <class T, class A>
struct orientedpoint: public point<T>{
  inline orientedpoint() : point<T>(0,0), theta(0) {};
    inline orientedpoint(const point<T>& p);
    inline void print(){cout << "(" << this->x << "," << this->y << "," << theta << ")";}
    A theta;
 
    friend class boost::serialization::access;
    template <class Archive> void serialize(Archive& ar, const unsigned int version){
        ar & this->x & this->y & theta;
    }
};
 
template <class T, class A>
orientedpoint<T,A>::orientedpoint(const point<T>& p){
    this->x=p.x;
    this->y=p.y;
    this->theta=0.;
}
 

/*
 * SensorReading
 *
 */
 
class Sensor{
    public:
        Sensor(const std::string& name="");
        virtual ~Sensor();
        inline std::string getName() const {return m_name;}
        inline void setName(const std::string& name) {m_name=name;}
 
        friend class boost::serialization::access;
        template <class Archive> void serialize(Archive& ar, const unsigned int version){
            ar & m_name;
        }
    protected:
        std::string m_name;
};
 
Sensor::Sensor(const std::string& name){
    m_name=name;
}
 
Sensor::~Sensor(){
}
 
class SensorReading{
    public:
        SensorReading(const Sensor* s=0, double time=0);
        virtual ~SensorReading();
        inline double getTime() const {return m_time;}
        inline void setTime(double t) {m_time=t;}
        inline const Sensor* getSensor() const {return m_sensor;}
        inline void print(){
            cout << "(" << m_time << "," << m_sensor->getName() << ")" << endl;
        }
        friend class boost::serialization::access;
        template <class Archive> void serialize(Archive& ar, const unsigned int version){
            ar & m_time & m_sensor;
        }
 
    protected:
        double m_time;
        const Sensor* m_sensor;
 
};
 
SensorReading::SensorReading(const Sensor* s, double t){
    m_sensor=s;
    m_time=t;
}
 

SensorReading::~SensorReading(){}
 
 
 
 
 
typedef orientedpoint<double, double> OrientedPoint;
/*
 * Particle
 *
 */
struct Particle{
    /**constructs a particle, given a map
    @param map: the particle map
    */
    //Particle(const ScanMatcherMap& map);
    Particle(){};
    /** @returns the weight of a particle */
    inline operator double() const {return weight;}
    /** @returns the pose of a particle */
    inline operator OrientedPoint() const {return pose;}
    /** sets the weight of a particle
    @param w the weight
    */
    inline void setWeight(double w) {weight=w;}
    /** Display a particle */
    inline void print(){
        cout << endl<< "Particle: " << endl;
        cout << "-----------------" << endl;
        cout << "OrientedPoint pose:         "; pose.print(); cout << endl;
        cout << "OrientedPoint previousPose: "; previousPose.print(); cout << endl;
        cout << "Weight: "<< weight << endl;
        cout << "WeightSum: "<< weightSum << endl;
        cout << "gweight: "<< gweight << endl;
        cout << "previousIndex: "<< previousIndex << endl;
        cout << "SensorReading: "; sr.print(); cout << endl;
          
    }
    /** The map */
    //ScanMatcherMap map;
    /** The pose of the robot */
    OrientedPoint pose;
 
    /** The pose of the robot at the previous time frame (used for computing thr odometry displacements) */
    OrientedPoint previousPose;
 
    /** The weight of the particle */
    double weight;
 
    /** The cumulative weight of the particle */
    double weightSum;
 
    double gweight;
 
    /** The index of the previous particle in the trajectory tree */
    int previousIndex;
 
    /** Entry to the trajectory tree */
    //TNode* node;
  
 
    //Tests
    SensorReading sr;
 
    friend class boost::serialization::access;
    template <class Archive> void serialize(Archive& ar, const unsigned int version){
        ar & pose & previousPose & weight & gweight & weightSum & previousIndex & sr;
    }
 
};

/*
 * Particle
 * SaveToFile and LoadFromFile
 *
 */
template <class A> void saveIntoFile(Particle& particle, const char* file){
        ofstream ofile(file);
        A ar(ofile);      
        ar << particle;
        ofile.close();
}
 
template <class A> void loadFromFile(Particle& particle, const char* file){
    ifstream ifile(file);
    A ar(ifile);
    ar >> particle;
    ifile.close();
    //return array;
}
 

/*
 * MAIN
 *
 */
int main(){
  
    Particle p = Particle();
 

    p.pose  = OrientedPoint(point<double>(1.1,4.4));
    p.previousPose  = OrientedPoint(point<double>(2.1,8.4));
    p.weight = 3;
    p.weightSum = 8.5;
    p.gweight = 12.7;
    p.previousIndex = 6;
 
    Sensor s= Sensor("Sensor Name");
    p.sr =  SensorReading(&s,35);  
 

    p.print();    
    saveIntoFile<text_oarchive>(p, "out.txt");  
 
    Particle p2 = Particle();
 
    loadFromFile<text_iarchive>(p2, "out.txt");
 
    p2.print();  
 
    cout << "end" << endl;
 
    return 0;
}