HelloHello,
I have written code below and it works
fine when using text archives. However, when I try to run it with the xml
archives it is throwing a strange error saying "Invalid XML tag name".
I have no idea what that means and could not find it in the documentation
of the serialization library. Could someone tell me what I am doing wrong
in this code?
Thanks a lot for help!
#include
<boost/smart_ptr/shared_ptr.hpp>
#include
<boost/archive/xml_oarchive.hpp>
#include
<boost/archive/xml_iarchive.hpp>
#include
<boost/archive/text_oarchive.hpp>
#include
<boost/archive/text_iarchive.hpp>
#include
<boost/serialization/vector.hpp>
#include
<boost/serialization/string.hpp>
#include
<boost/serialization/shared_ptr.hpp>
#include
<boost/date_time/local_time/local_time.hpp>
#include
<boost/serialization/export.hpp>
#include
<iostream>
using
namespace
boost;
using
namespace
std;
class
Actor
{
public:
Actor(
void
) {}
Actor(
char
gender )
: gender( gender )
{}
virtual
~Actor() {}
char
Gender( void
) const
{ return
gender; }
private:
friend
class
boost::serialization::access;
template<class
Archive>
void
serialize(Archive & ar, const
unsigned
int
version)
{
ar & BOOST_SERIALIZATION_NVP(gender);
}
char
gender;
};
class
Crit: public
Actor
{
public:
Crit(
void
) {}
Crit(
int
age )
: age( age )
{
}
int
Age( void
) const
{ return
age; }
private:
friend
class
boost::serialization::access;
template<class
Archive>
void
serialize(Archive & ar, const
unsigned
int
version)
{
ar & BOOST_SERIALIZATION_NVP(boost::serialization::base_object<
Actor >( *this
));
ar & BOOST_SERIALIZATION_NVP(age);
}
int
age;
};
class
Food: public
Actor
{
public:
Food(
void
) {}
Food(
int
energy )
: energy( energy )
{
}
int
Energy( void
) const
{ return
energy; }
private:
friend
class
boost::serialization::access;
template<class
Archive>
void
serialize(Archive & ar, const
unsigned
int
version)
{
ar & BOOST_SERIALIZATION_NVP(boost::serialization::base_object<
Actor >( *this
));
ar & BOOST_SERIALIZATION_NVP(energy);
}
int
energy;
};
BOOST_CLASS_EXPORT_GUID( Actor, "Actor")
BOOST_CLASS_EXPORT_GUID( Crit, "Crit")
BOOST_CLASS_EXPORT_GUID( Food, "Food")
template<
typename
T >
void
save( T& data, string filename )
{
ofstream
ofs( filename.c_str() );
boost::archive::xml_oarchive
oa( ofs );
oa
& BOOST_SERIALIZATION_NVP(data);
}
template<
typename
T >
void
load( T& data, string filename )
{
ifstream
ofs( filename.c_str() );
boost::archive::xml_iarchive
ia( ofs );
ia
& BOOST_SERIALIZATION_NVP(data);
}
void
TestAlpha( void
)
{
shared_ptr<
Crit > critAlpha( new
Crit( 18 ) );
shared_ptr<
Crit > critBravo( new
Crit( 19 ) );
shared_ptr<
Food > foodAlpha( new
Food( 20 ) );
shared_ptr<
Food > foodBravo( new
Food( 21 ) );
vector<
shared_ptr< Actor > > conAlpha;
vector<
shared_ptr< Actor > > conBravo;
conAlpha.push_back(
critAlpha );
conAlpha.push_back(
foodAlpha );
//
save
string
filename = "sav.sav";
save(
conAlpha, filename );
//
test
assert(
critBravo->Age() == 19 );
assert(
foodBravo->Energy() == 21 );
//
load
load(
conBravo, filename );
//
test
critBravo
= dynamic_pointer_cast< Crit >( conBravo[ 0 ] );
assert(
critBravo->Age() == 18 );
foodBravo
= dynamic_pointer_cast< Food >( conBravo[ 1 ] );
assert(
foodBravo->Energy() == 20 );
}
int
main()
{
try
{
TestAlpha();
}
catch(boost::archive::archive_exception&
e)
{
return
-1;
}
return
0;
}
___________________________________________________________
This e-mail may contain confidential and/or privileged information. If you are not the intended recipient (or have received this e-mail in error) please notify the sender immediately and delete this e-mail. Any unauthorised copying, disclosure or distribution of the material in this e-mail is prohibited.
Please refer to http://www.bnpparibas.co.uk/en/information/legal_information.asp?Code=ECAS-845C5H for additional disclosures.