使用Boost,如何在类层次结构更改后反序列化c ++类

时间:2014-07-23 16:32:31

标签: c++ class serialization boost hierarchy

我正在使用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);
}

是否可以将使用以前类层次结构保存的数据反序列化到新设计中?

此致 约翰

1 个答案:

答案 0 :(得分:1)

我假设您已熟悉Boost序列化(Boost class serialization, change in member types)中的常规版本控制支持。

在这种情况下,我说你无法预料到这一点,因为类型信息是"顺便说一下"在数据流中(并且可能不再映射)。我建议让旧的层次结构仍然可用,例如使用内联命名空间:

namespace MyNS
{
      namespace V1 {

             struct Alpha;
             struct Beta;

      }

      inline namespace V2 {

             struct Alpha;
             struct Beta;

             struct Document { /* */ }

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

 }