If this is what I think it is, it might be already
fixed in the trunk.
Robert Ramey
Ok
first I hadn't realised my attachment was removed. So I include the
source
code below. This is small and self contained.
o The compile error on
AIX was removed because I saving via a non const
variable. ( Note
however gcc 4.2.1. on Linux it did not complain.)
o To recap this
compiles and runs on Linux with gcc 4.2.1 but
crashes/exception on
AIX V10.1. Because it reckons the derived/base
relationship has not
been
registered.
...
oserializer.hpp
// convert pointer to more derived type. if this is
thrown
// it means that the base/derived relationship hasn't be
registered
vp =
serialization::void_downcast(
*true_type,
*this_type,
static_cast<const void
*>(&t)
);
if(NULL ==
vp){
boost::serialization::throw_exception(
>>>>
archive_exception(archive_exception::unregistered_cast)
);
}
Note if a save via the derived ptr, then it
works.
o If I explicitly register this relationship, (see code
below)
Then I get past the first exception only to get an
assert.
// since true_type is valid, and this only gets made if the
// pointer oserializer object has been created, this should
never
//
fail
const basic_pointer_oserializer * bpos
= archive_pointer_oserializer<Archive>::find(*
true_type);
>>> assert(NULL !=
bpos);
if(NULL ==
bpos)
boost::serialization::throw_exception(
archive_exception(archive_exception::unregistered_class)
);
ar.save_pointer(vp, bpos);
o Initially I thought it was compiled
without rtti on AIX.
However this was not the case. Here is compile
line.
xlC -c -DDEBUG -qcpluscmt -qNOOPTimize
-qnoinline -g
-qfullpath
-qfuncsect
-qeh
-qrtti
-qtemplatedepth=700
-I"../SCRATCH/src" -I"/s1a/emos_esuite/emos_data/sms/boost_1_39_0"
-o
"bin/vacpp/debug/src/TestSerialisation.o"
"src/TestSerialisation.cpp"
This is show stopper bug that I must
get fixed.
Are there any more things I can try to debug this
?
Any help would be much appreciated.
//===============
the example ========================
#include <fstream>
#include
<assert.h>
#include
<boost/archive/text_iarchive.hpp>
#include
<boost/archive/text_oarchive.hpp>
#include
<boost/serialization/base_object.hpp>
#include
<boost/serialization/string.hpp>
#include <boost/serialization/export.hpp>
class RepeatBase {
public:
RepeatBase()
{}
virtual ~RepeatBase() {}
virtual const
std::string& name() const = 0;
private:
friend class
boost::serialization::access;
template<class
Archive>
void serialize(Archive & ar, const unsigned
int version) {}
};
class RepeatDerived : public RepeatBase
{
public:
RepeatDerived( const std::string& name) :
name_(name) {}
RepeatDerived() {}
virtual const std::string& name() const { return
name_;}
private:
std::string name_;
friend class boost::serialization::access;
template<class
Archive>
void serialize(Archive & ar, const unsigned
int version) {
// save/load base
class information
ar
&
boost::serialization::base_object<RepeatBase>(*this);
ar & name_;
}
};
class Defs
{
public:
Defs(const std::string& f) : fileName_(f),
repeat_(new RepeatDerived(f)) {}
Defs() : repeat_(NULL)
{}
~Defs() { delete repeat_;}
bool
operator==(const Defs& rhs) const { return fileName_ ==
rhs.fileName_;}
const std::string& fileName() const {
return fileName_;}
private:
std::string
fileName_;
RepeatBase* repeat_;
friend
class boost::serialization::access;
template<class
Archive>
void serialize(Archive & ar, const unsigned
int /*version*/) {
ar
& fileName_;
ar &
repeat_;
}
};
BOOST_CLASS_EXPORT(RepeatBase);
BOOST_CLASS_EXPORT(RepeatDerived);
BOOST_SERIALIZATION_ASSUME_ABSTRACT(RepeatBase)
int
main()
{
// With this explicit register, we get a bit
further, but still crashes on AIX
//
boost::serialization::void_cast_register<RepeatDerived,
RepeatBase>(0,0);
const Defs
saveDefs("saveFile.txt");
{
// Save the
defs file
std::ofstream ofs( saveDefs.fileName().c_str()
);
boost::archive::text_oarchive oa( ofs );
oa <<
saveDefs;
// BOMBS out here on AIX V10.1
}
{
// Restore the defs
file
Defs
loadDefs;
std::ifstream
ifs(saveDefs.fileName().c_str());
boost::archive::text_iarchive ia(ifs);
ia
>> loadDefs;
assert( saveDefs
== loadDefs );
}
return
0;
}
//===============================================
Best
regards,
Ta,
Avi
_______________________________________________
Boost-users mailing
list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users