Проблемы с использованием boost :: serialization при сохранении через указатель - PullRequest
0 голосов
/ 04 ноября 2019

Я знаю, что есть похожие вопросы, но ни один из них не применим к этому делу. У меня есть иерархия классов, составленная из чистого абстрактного «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, но результат не изменился.

...