Я знаю, что есть похожие вопросы, но ни один из них не применим к этому делу. У меня есть иерархия классов, составленная из чистого абстрактного «AccessStrategy» и производного «RMOAccess».
Я пишу тест, который проверяет, что сохраненный и полученный объекты равны:
[...]
void storeAccessStrategy(const AccessStrategy* as){
boost::archive::text_oarchive oa(stream);
oa.register_type(static_cast<Symposium::RMOAccess *>(NULL));
oa<<as;
}
void loadAccessStrategy(AccessStrategy* as){
boost::archive::text_iarchive ia(stream);
ia.register_type(static_cast<Symposium::RMOAccess *>(NULL));
ia>>as;
}
};
TEST_F(AccessStrategySerializationTest, RMOAccessSerialization){
[... putting something in RMOtoStore..]
storeAccessStrategy(&RMOtoStore);
loadAccessStrategy(&RMOtoLoad);
EXPECT_EQ(RMOtoStore, RMOtoLoad);
}
Итак, проблема в том, что я обращаюсь к объектам типа "RMOAccess" (например, RMOtoStore) через указатель. В классе, который я написал (это тот же самый .h):
class AccessStrategy {
[...This class has no member variable, so i don't need to save anything...]
void serialize(Archive &ar, const unsigned int version){};
[...]
}
BOOST_SERIALIZATION_ASSUME_ABSTRACT(AccessStrategy)
class RMOAccess : public AccessStrategy {
[...]
void serialize(Archive &ar, const unsigned int version)
{
// save/load base class information
ar & boost::serialization::base_object<AccessStrategy>(*this);
ar & permission;
}
Все компилируется нормально, но тест не проходит, это как правильный serialize (), который не вызывается.
Я пытался следовать решениям, предложенным в некоторых других публикациях: я старался не использовать динамический ar & boost :: serialization :: base_object (* this), поэтому использовал BOOST_CLASS_EXPORT (), либо для одного, либо для обоих классов. Я также пытался использовать BOOST_CLASS_EXPORT_GUID, но результат не изменился.