I've been pulling my hair out for a couple of days trying to get this to
work.
When I serialize something from a base pointer, it throws an
"unregistered_class" exception.
I know the type of object that's being serialized and that class has
"BOOST_CLASS_EXPORT_KEY" in the header and "BOOST_CLASS_EXPORT_IMPLEMENT"
in the cpp file with the same name.
In the save and load functions I also have:
boost::serialization::void_cast_register(
static_cast(NULL),
static_cast(NULL));
The base class is an abstract base class with one pure virtual function
method. But here are the differences:
1) I tried using the "ASSUME_ABSTRACT....." macro. That didn't do anything
for me.
2) The abstract base class also has a cpp file with some code in it. I'm
not sure if that matters or not...
Here's the thing. I can get the derived class's "save" method to be called
with this code:
std::ofstream o(case_path_ + "/" + file_name);
if (o.good())
{
// MUST HAVE THIS
boost::serialization::void_cast_register(
static_cast(NULL),
static_cast(NULL));
boost::archive::polymorphic_text_oarchive oa(o);
boost::archive::polymorphic_oarchive & oa_interface = oa;
oa_interface << base_ptr;
}
Having the void_cast_register() there sort of defeats the purpose though. I
shouldn't need to pre-register them.
In all the examples, I see the void_cast_register() inside of the "save"
and "load" methods, which is what I have already.
All my serialization code resides in cpp files.
Also, the serialization code resides in a static lib.
But the archive creation and the action to serialize is performed in a
dynamic lib.
I am also using polymorphic archives everywhere.
I've also forced template instantiation of all serialization code and
polymorphic archive interface stuff.
Any clue?