Boost logo

Boost Users :

Subject: Re: [Boost-users] Serialization of pointers ?-->loadingnotworking...
From: Simon Ruffieux (simon.ruffieux_at_[hidden])
Date: 2010-01-20 05:38:33


So I resolved the problem using const !
I post as it may be profitable to someone else ...

It is only needed to split the serialize function into save and load
functions and then to const_cast the Sensor

Here is the code:

#include <iostream>
#include <iterator>
#include <algorithm>

#include <sstream>
#include <fstream>
#include <vector>

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

using namespace std;
using namespace boost::archive;
using namespace boost::serialization;

/*
 * Class Sensor
 *
 */
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;}

    protected:
        std::string m_name;

    private:
        friend class boost::serialization::access;
        template <class Archive> void serialize(Archive& ar, const unsigned
int version){
            cout << "Serialization of Sensor" << endl;
            ar & m_name;
        }
};

Sensor::Sensor(const std::string& name){
    m_name=name;
}

Sensor::~Sensor(){
}

/*
 * Class SensorReading
 *
 */
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 << "SensorReading: " << "(" << m_time << "," <<
m_sensor->getName() << ")" << endl;
        }

    protected:
        double m_time;
        const Sensor* m_sensor;

    private:
        friend class boost::serialization::access;
        template <class Archive> void save(Archive& ar, const unsigned int
version)const{
            cout << "Serialization of SensorReading" << endl;
            ar << m_time;
            ar << m_sensor;
        }
        template <class Archive> void load(Archive& ar, const unsigned int
version){
            cout << "Deserialization of SensorReading" << endl;
            ar >> m_time;
            ar >> const_cast<Sensor*&>(m_sensor);
        }
        template <class Archive> void serialize(Archive& ar, const unsigned
int version){
            boost::serialization::split_member(ar, *this, version);
        }
};

SensorReading::SensorReading(const Sensor* s, double t){
    m_sensor=s;
    m_time=t;
}

SensorReading::~SensorReading(){}

/*
 * Class SensorReading
 *
 */

template <class A> void saveIntoFileSens(SensorReading& sr, const char*
file){
        ofstream ofile(file);
        A ar(ofile);
        ar << sr;
        ofile.close();
}

template <class A> void loadFromFileSens(SensorReading& sr, const char*
file){
    ifstream ifile(file);
    A ar(ifile);
    ar >> sr;
    ifile.close();
}

/*
 * MAIN
 *
 */
int main(){

    const Sensor s = Sensor("SensorNom");
    SensorReading sr = SensorReading(&s,67);

    sr.print();
    saveIntoFileSens<text_oarchive>(sr, "out.txt");
    SensorReading sr2;
    loadFromFileSens<text_iarchive>(sr2, "out.txt");
    sr2.print();

    cout << "end" << endl;

    return 0;
}

----- Original Message -----
From: "Simon Ruffieux" <simon.ruffieux_at_[hidden]>
Newsgroups: gmane.comp.lib.boost.user
To: <boost-users_at_[hidden]>
Sent: Friday, January 15, 2010 9:54 AM
Subject: Re: Serialization of pointers ?-->loadingnotworking...

> Hum hum ...
>
> The problem was that my Sensor pointer contained in the class
> SensorReading was declared const:
>
> class SensorReading{
> public:
> SensorReading(const Sensor* s=0, double time=0);
> virtual ~SensorReading();
>
> protected:
> double m_time;
> const Sensor* m_sensor;
> };
>
> If I do not declare it as Sensor* m_sensor; And correct accordingly the
> different functions prototypes. Then it works.
>
> However I was wondering if there were anyway of serializing it while
> keeping it const ?
>
> Thansk
>
> ----- Original Message -----
> From: "Simon Ruffieux" <simon.ruffieux_at_[hidden]>
> Newsgroups: gmane.comp.lib.boost.user
> To: <boost-users_at_[hidden]>
> Sent: Friday, January 15, 2010 9:22 AM
> Subject: Re: Serialization of pointers ? -->loadingnotworking...
>
>
>>I should maybe have attached with the message this more reduced code
>>containing only the problematic classes.
>>
>> This code fails as previously said during compilation because of the
>> "loadFromFileSens"
>>
>> CODE
>>
>> /*
>> * 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(){}
>>
>>
>> template <class A> void saveIntoFileSens(SensorReading& sr, const char*
>> file){
>> ofstream ofile(file);
>> A ar(ofile);
>> ar << sr;
>> ofile.close();
>> }
>> template <class A> void loadFromFileSens(SensorReading& sr, const char*
>> file){
>> ifstream ifile(file);
>> A ar(ifile);
>> ar >> sr;
>> ifile.close();
>> }
>>
>> /*
>> * MAIN
>> *
>> */
>> int main(){
>>
>> Sensor s = Sensor("SensorNom");
>> SensorReading senr = SensorReading(&s,67);
>>
>> saveIntoFileSens<text_oarchive>(senr, "out.txt");
>> loadFromFileSens<text_iarchive>(senr, "out.txt");
>>
>> return 0;
>> }
>>
>>
>> ----- Original Message -----
>> From: "Simon Ruffieux" <simon.ruffieux_at_[hidden]>
>> Newsgroups: gmane.comp.lib.boost.user
>> To: <boost-users_at_[hidden]>
>> Sent: Friday, January 15, 2010 9:04 AM
>> Subject: Re: Serialization of pointers ? --> loadingnotworking...
>>
>>
>>> Thanks for your quick answer !
>>>
>>> But the orientedPoints do work do work perfectly ! (Even without
>>> specifying the derived class)
>>>
>>> The problem is with the pointer to Sensor* contained in the
>>> SensorReading class .... And it seems to me this is not a derived class
>>> ....
>>>
>>> I'll keep trying ...
>>>
>>>
>>>
>>> ----- Original Message -----
>>> From: "Robert Ramey" <ramey_at_[hidden]>
>>> Newsgroups: gmane.comp.lib.boost.user
>>> To: <boost-users_at_[hidden]>
>>> Sent: Thursday, January 14, 2010 5:56 PM
>>> Subject: Re: Serialization of pointers ? --> loading notworking...
>>>
>>>
>>>> replace
>>>> friend class boost::serialization::access;
>>>> template <class Archive> void serialize(Archive& ar, const unsigned
>>>> int version){
>>>> ar & this->x & this->y & theta;
>>>> }
>>>>
>>>> with something like:
>>>> friend class boost::serialization::access;
>>>> template <class Archive> void serialize(Archive& ar, const unsigned
>>>> int version){
>>>> ar & boost::serialization::base_object<?>(*this);
>>>> }
>>>>
>>>> Look through the documentation and samples on how to serialize derived
>>>> classes.
>>>>
>>>> Robert Ramey


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