Boost logo

Boost :

Subject: Re: [boost] Boost::Serialization Combined XML- and Binary-Serialization
From: Robert Ramey (ramey_at_[hidden])
Date: 2009-07-20 02:43:24


Try replacing

>>> --------------------------------------------------------
>>> 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;
>>> }
>>> }
>>>

with std::ofstream ofs(filename.c_str(), std::ios::binary);

same with input.

Robert Ramey

Daniel Kunz wrote:
> Hello,
>
> I found my failure with xml serialization. It works now! Thanks Robert
> Ramey!
>
> Now I just have my problems with binary serialization. Can somebody
> help me with this?
>
> Best regards.
> Daniel
>
> Robert Ramey wrote:
>
>> Try replacing
>>> boost::serialization::binary_object bo =
>>> boost::serialization::make_binary_object(minute,
>> with
>
>> boost::serialization::binary_object bo =
>> boost::serialization::make_binary_object(& minute,
>
>> Robert Ramey
>> Daniel Kunz wrote:
>>> 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
> _______________________________________________
> Unsubscribe & other changes:
> http://lists.boost.org/mailman/listinfo.cgi/boost


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