I posted this
earlier, but I don't think it went through all the way. I apologize if
this is a duplicate:
--------------------------------------------------------------------------------------------
Hi All,
Boost newbie here: I am
having problems with getting serialization to work
with my app. I have
a top-level "environment" context that objects in my app
need to be
associated with. I thought about various ways to accomplish this
and I
thought the best way might be to derive an Archive class that maintains
a
reference to the context and use custom
save_construct_data/load_construct_data
overrides.
However, I am hitting a snag and I don't quite
understand what is happening. I
derive an input and output archive from
text_iarchive/text_oarchive
respectively and I use this archive
context. However I get the following
error in
compilation:
db.hh: In function `void
boost::serialization::load_construct_data(Archive&,
FlatFileDb::Db*, unsigned int) [with Archive =
boost::archive::text_iarchive]':
/ccase/cca/vendor/boost/boost/serialization/serialization.hpp:170:
instantiated from `void
boost::serialization::load_construct_data_adl(Archive&,
T*,
unsigned int)
[with Archive = boost::archive::text_iarchive, T =
FlatFileDb::Db]'
/ccase/cca/vendor/boost/boost/archive/detail/iserializer.hpp:303:
instantiated
from `void boost::archive::detail::pointer_iserializer<T,
Archive>::load_object_ptr(boost::archive::detail::basic_iarchive&,
void*&,
unsigned int) const [with T = FlatFileDb::Db, Archive
=
boost::archive::text_iarchive]'
/ccase/cca/vendor/boost/boost/archive/detail/iserializer.hpp:209:
instantiated from here
db.hh:84: error: 'class
boost::archive::text_iarchive' has no member named '
m_env'
Somehow the system is assigning <class
Archive> to 'class
boost::archive::text_iarchive' even though I am
creating the archive as
something derived from text_iarchive. The weird
thing is that this happens
even if I comment out the code the invokes the
actual archiving. Its almost
like there is some default value of
Archive that gets assigned once I include
the text_iarchive.hpp file.
Any ideas on how to stop this from happening?
Is there a better way to
accomplish my goal?
Thanks in advance!
-Greg
PS: Here are some code snippets of what I am
doing.
I have a header file called "archive.hh" with
-----------------------------------------------------------
#include <boost/archive/text_iarchive.hpp>
#include
<boost/archive/text_oarchive.hpp>
namespace FlatFileDb
{
class Env;
class OArchive : public
boost::archive::text_oarchive_impl<OArchive>
{
public:
OArchive(Env &env,
std::ostream & os, unsigned int flags = 0)
:
boost::archive::text_oarchive_impl<OArchive>(os, flags),
m_env(env)
{}
~OArchive(){}
Env
&m_env;
};
class IArchive : public
boost::archive::text_iarchive_impl<IArchive>
{
public:
IArchive(Env &env,
std::istream & is, unsigned int flags = 0)
:
boost::archive::text_iarchive_impl<IArchive>(is, flags),
m_env(env)
{}
~IArchive(){}
Env
&m_env;
};
};
--------------------------------------------------
and then I have another header file (db.hh) with:
--------------------------------------------------
<.../snip...>
namespace boost { namespace serialization {
template<class
Archive>
inline void save_construct_data(
Archive
& ar, const FlatFileDb::Db *t, const unsigned int
file_version
){
// save data required to construct
instance
ar << t->m_name;
}
template<class Archive>
inline void
load_construct_data(
Archive & ar, FlatFileDb::Db* t,
const unsigned int file_version
){
// retrieve data
from archive required to construct new instance
std::string name;
ar >> name;
// invoke inplace constructor to initialize instance of
my_class
::new(t)FlatFileDb::Db(ar.m_env, name);
<-- !!! blows up here !!!y
}
}} // namespace
...