Boost logo

Boost Users :

From: Pavlo Korzhyk (pavlo.korzhyk_at_[hidden])
Date: 2006-10-26 10:08:30


The following code crashes under cygwin+boost1.33 and under mingw+boost1.33

I create text archive in a file, and then serialization crashes when
restoring object from that archive.
The problem seem to be with bool field, if I replace
    bool x;
with
    int x;
in the class Obj implementation, everything runs fine.

Is this a bug in serialization code?

#include <iostream>
#include <sstream>
#include <fstream>
#include <vector>
#include <map>
using namespace std;

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/map.hpp>

using namespace boost;
using namespace boost::serialization;

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

class Item;

class Cheq : public Obj{
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & boost::serialization::base_object<Obj>(*this);
        ar & v;
        ar & id;
    }

public:
    vector<Item> v;
    int id;

    Cheq(){}
};

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

class Row{
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & m1;
        ar & m2;
    }
public:
    map<string,string> m1,m2;
};

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

public:
    int a;
    map<string,string> m;
    map<int,Cheq> cheque;
};

BOOST_CLASS_TRACKING(Data, boost::serialization::track_never)

#include "boost/serialization/export.hpp"
BOOST_CLASS_EXPORT(Data);
BOOST_CLASS_EXPORT(Cheq);
BOOST_CLASS_EXPORT(Item);

int main(int argc, char** argv)
{
    Data d;
    d.cheque[0]=Cheq();

    //if(argc>1 && argv[1][0]=='1')
    {
        ofstream os("datfile");
        boost::archive::text_oarchive oar(os);
        oar << d;
    }

    //if(argc>1 && argv[1][0]=='2')
    {
        ifstream is("datfile");
        boost::archive::text_iarchive iar(is);
        iar >> d;
    }
    cout << "without crash\n";
    return 0;
}

-- 
WBR, Pavlo Korzhyk
ICQ#155870780


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