Boost logo

Boost :

Subject: [boost] Boost::Serialization Combined XML- and Binary-Serialization
From: Daniel Kunz (kunzda_at_[hidden])
Date: 2009-07-15 02:55:04


Hello,
I try to write an function, which can convert data via the serialization
interface
XML --> class --> binary AND
binary --> class --> XML
I read the documentation and in the mailing lists but I could not finish my
functions.

I have 2 problems:
1) the xml function delivers no xml data in my testfile output
2) I cannot add the binary structure to the existing xml-working classes
With the binary serialization I didn't find many informations, but that
informations I found I can't use with the classes I prepared for xml
serialization
Is it possible to combine that 2 serializations

Here is my testing code I worked with so far. The finish coding is similar
with that class structure.

The class structure:

--------------------------------------------------------
goal.cpp
--------------------------------------------------------
#include <string>
#include <iostream>

using namespace std;

#include <boost/serialization/base_object.hpp>
#include <boost/serialization/list.hpp>
#include <boost/serialization/is_abstract.hpp>

#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/serialization/binary_object.hpp>
namespace serialization
{

class Goal
{
        public:
        enum Scored{home=0, visitors=1};
        Goal(){};
        Goal(const string _name, int &_minute, bool &_shootout, Scored
&_scored, bool &_penality);
        ~Goal(){};
        friend ostream & operator<<(ostream &os, const Goal &_goal);
    private:
        friend class boost::serialization::access;
        template<class Archive>
        void serialize(Archive & ar, const unsigned int version)
        {
            using boost::serialization::make_nvp;
            ar & make_nvp("Name", name);
            ar & make_nvp("Minute", minute);
            ar & make_nvp("Shootout", shootout);
            ar & make_nvp("Scored", scored);
            ar & make_nvp("Penality", penality);

            boost::serialization::binary_object bo =
                 boost::serialization::make_binary_object(minute,
sizeof(minute));
            ar & bo;
        }
        string name;
        int minute;
        bool shootout;
        Scored scored;
        bool penality;
};
}

--------------------------------------------------------
stadium.h
--------------------------------------------------------
#include <string>
#include <iostream>

using namespace std;
#include <boost/serialization/base_object.hpp>
#include <boost/serialization/list.hpp>
#include <boost/serialization/is_abstract.hpp>

#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>

namespace serialization
{

class Stadium
{
    private:
        friend class boost::serialization::access;
        template<class Archive>
        void serialize(Archive & ar, const unsigned int version)
        {
            using boost::serialization::make_nvp;
            ar & make_nvp("Name", name);
            ar & make_nvp("City", city);
            ar & make_nvp("Spectators", spectators);
        }
        string name;
        string city;
        int spectators;
    public:
        Stadium(){};
        Stadium(const string _name, const string _city, int &_spectators);
        friend ostream & operator<<(ostream &os, Stadium &_stadium);
};
}

--------------------------------------------------------
match.h
--------------------------------------------------------
#include <list>
#include <time.h>
#include <string>
#include <iostream>
#include <cstdio>

using namespace std;

#include <boost/serialization/base_object.hpp>
#include <boost/serialization/list.hpp>
#include <boost/serialization/is_abstract.hpp>

#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/serialization/serialization.hpp>

#include "goal.h"
#include "stadium.h"

namespace serialization
{

class Match
{
    private:
        friend class boost::serialization::access;
        template<class Archive>

        void serialize(Archive & ar, const unsigned int version)
        {
            using boost::serialization::make_nvp;
            ar & make_nvp("Home", home);
            ar & make_nvp("Visitors", visitors);
            ar & make_nvp("Kickoff", kickoff);
            ar & make_nvp("Goals", goals);
            ar & make_nvp("Stadium", stadium);
        }
        string home;
        string visitors;
        time_t kickoff;
        typedef list<Goal> lGoals;
        lGoals goals;
        Stadium stadium;
    public:
        Match(){};
        Match(const string _home, const string _visitors, time_t &_kickoff,
Goal *_goals, int size, Stadium &_stadium);
        Match& operator = (Match &_match);
        friend ostream & operator<<(ostream &out, Match &_match);
};
}

--------------------------------------------------------
xml.cpp
--------------------------------------------------------
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>

#include <iomanip>
#include <iostream>
#include <fstream>
#include <string>

#include "goal.h"
#include "stadium.h"
#include "match.h"

#include <boost/serialization/base_object.hpp>
#include <boost/serialization/utility.hpp>
#include <boost/serialization/list.hpp>
#include <boost/serialization/is_abstract.hpp>

using namespace std;

void save_xml(const serialization::Match &m, const string &filename)
{
    try
    {
    ofstream ofs(filename.c_str());
    assert(ofs.good());
    boost::archive::xml_oarchive oa(ofs);
    oa << boost::serialization::make_nvp("Match", m);
    }
    catch(exception &e)
    {
        cout << e.what() << endl;
    }
}

void restore_xml(serialization::Match &m, const string &filename)
{
    try
    {
    ifstream ifs(filename.c_str());
    boost::archive::xml_iarchive ia(ifs);
    ia >> boost::serialization::make_nvp("Match", m);
    }
    catch(exception &e)
    {
        cout << e.what() << endl;
    }
}

--------------------------------------------------------
binary.cpp
--------------------------------------------------------
void save_bin(const serialization::Match &m, const string &filename)
{
    try
    {
        std::ofstream ofs(filename.c_str());
        boost::archive::binary_oarchive oa(ofs);
        //oa << m;
    }
    catch(exception &e)
    {
        cout << e.what() << endl;
    }
}

void restore_bin(serialization::Match &m, const string &filename)
{
    try
    {
        std::ifstream ifs(filename.c_str());
        boost::archive::binary_iarchive ia(ifs);
        //ia >> m;
    }
    catch(exception &e)
    {
        cout << e.what() << endl;
    }
}

I hope somone can help me. I don't know what I can do to complete that
functions.

Best regards
Daniel


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk