【问题标题】:Using Boost, How to de-serialize c++ classes after class hierarchy changed使用 Boost,如何在类层次结构更改后反序列化 c++ 类
【发布时间】:2014-07-23 16:32:31
【问题描述】:

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

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

问候, 约翰

【问题讨论】:

    标签: c++ class serialization boost hierarchy


    【解决方案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&&); 
          }
    
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 2019-04-09
      相关资源
      最近更新 更多