Использование Boost, как десериализовать классы c ++ после изменения иерархии классов

Я использую boost для сериализации \ де-сериализации нескольких классов на диск. Я занимаюсь рефакторингом многих классов, которые требуют изменения иерархии классов. Я надеюсь, что следующий псевдокод достаточно ясно описывает мою ситуацию:

Первоначальный дизайн был похож на следующий:

class Alpha : public BaseOne, public BaseTwo
{
    //member data omitted
    void serialize(Archive & ar, const unsigned int version);
}
inline void Alpha::serialize(Archive & ar, const unsigned int version)
{
    ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(BaseOne);
    ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(BaseTwo);
    // also serialize member data
}

class Beta: public Alpha
{
    //member data omitted
    void serialize(Archive & ar, const unsigned int version);
}

inline void Beta:::serialize(Archive & ar, const unsigned int version)
{
    ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Alpha);
    // also serialize member data
}

Иерархия классов изменилась на следующую:

class Alpha : public BaseOne
{
    void serialize(Archive & ar, const unsigned int version);
}

class Beta: public Alpha, public BaseTwo
{
    void serialize(Archive & ar, const unsigned int version);
}

Можно ли десериализовать данные, сохраненные в предыдущей иерархии классов, в новый дизайн?

С уважением, Джон


person JohnG    schedule 23.07.2014    source источник


Ответы (1)


Я предполагаю, что вы знакомы с обычной поддержкой управления версиями в Boost Serialization (Повышение сериализации классов, изменение типов элементов)).

В этом случае, я бы сказал, вы не можете ожидать, что это сработает, потому что информация о типе «мешает» в потоке данных (и потенциально больше не может быть отображена). Я бы предложил сделать старую иерархию доступной, например с использованием встроенных пространств имен:

namespace MyNS
{
      namespace V1 {

             struct Alpha;
             struct Beta;

      }

      inline namespace V2 {

             struct Alpha;
             struct Beta;

             struct Document { /* */ }

             Document upgrade(V1::Document&&); 
      }

 }
person sehe    schedule 24.07.2014