Thanks for the pointer Robert
I trawled up the following 2 items of doc, but made little process
http://www.boost.org/doc/libs/1_44_0/libs/serialization/doc/special.html#dll...
http://www.boost.org/doc/libs/1_44_0/libs/serialization/doc/special.html#plu...
If I follow the documentation I get a "derived class not registered..." at
runtime. So I looked at the unit tests.
The one for my case seems to be test_dll_plugin.cpp.
In that test polymorphic_base (the interface type known statically at the poiont
of serialization) uses the extended_type_info_no_rtti ETI scheme.
This is in contrast to polymorphic_derived2 (the concrete type UNknown statically at
the poiont of serialization) using the extended_type_info_typeid ETI scheme.
Do I *have to* use no_rtti for my abstract interface types?
If I use the typeid scheme everything builds but I get "derived class not registered..."
at runtime.
If I follow the test_dll_plugin.cpp pattern, then the code STATIC_ASSERTS
extended_type_info_no_rtti.hpp(87) at the point of serialization.
The STATIC_ASSERT comment says
// if your program traps here - you failed to
// export a guid for this type. the no_rtti
// system requires export for types serialized
// as pointers.
Adding
BOOST_CLASS_EXPORT_KEY(boost::shared_ptr)
or
BOOST_CLASS_EXPORT_GUID(boost::shared_ptr, "xyz")
to serialize.cpp will make no difference.
I really can't figure out what's wrong. I hope someone out there can spot
the problem!
##################### DLL/MODULE 1 #####################################
-------------------------------------------- interface.hpp
#include
struct DLL_EXPORT I_DoSomething
{
virtual const char * get_key() const = 0;
virtual void doIt() = 0;
static boost::shared_ptr create(); // static factory
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & /* ar */, const unsigned int /* file_version */);
}
#include
#include
#include
#include
BOOST_SERIALIZATION_ASSUME_ABSTRACT(I_DoSomething)
BOOST_CLASS_EXPORT_KEY(I_DoSomething)
BOOST_CLASS_TYPE_INFO(I_DoSomething, boost::serialization::extended_type_info_no_rtti)
-------------------------------------------- ConcreteType.cpp
#include "interface.hpp"
class ConcreteType : public I_DoSomething
{
virtual const char * get_key() const
{
return "ConcreteType";
}
...
.....
private:
void serialize(Archive & ar, const unsigned int /*version*/)
{
ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(I_DoSomething);
ar & ...
}
}
boost::shared_ptr I_DoSomething::create()
{
return new ConcreteType();
}
#include
#include
BOOST_CLASS_EXPORT_KEY(ConcreteType)
BOOST_CLASS_TYPE_INFO(ConcreteType, boost::serialization::extended_type_info_typeid<ConcreteType>)
BOOST_CLASS_EXPORT_IMPLEMENT(ConcreteType)
#include
#include
template DLLEXPORT void ConcreteType::serialize(boost::archive::xml_oarchive & ar, const unsigned int version);
template DLLEXPORT void ConcreteType::serialize(boost::archive::xml_iarchive & ar, const unsigned int version);
#include
BOOST_SERIALIZATION_FACTORY_0(ConcreteType)
##################### DLL 2 which linked with DLL 1 #####################
-------------------------------------------- serialize.cpp
#include "interface.hpp"
#include
#include
BOOST_CLASS_EXPORT_KEY(boost::shared_ptr)
...
boost::shared_ptr obj = I_DoSomething::create();
boost::text_oarchive oa;
oa << obj; // <-------- STATIC_ASSERTS at extended_type_info_no_rtti.hpp(87)
...