【问题标题】:Boost serialization cope of different versionsBoost 不同版本的序列化处理
【发布时间】:2013-02-11 09:48:41
【问题描述】:

我正在使用 boost 进行序列化:

bool saveParams(std::string filename)
{
    using boost::serialization::make_nvp;
    std::ofstream ofs(filename.c_str());
    if(ofs.is_open() == false) return false;
    boost::archive::xml_oarchive xml(ofs);

    xml << make_nvp("Param1", param1value);
    xml << make_nvp("Param2", param2value);
    xml << make_nvp("Param3", param3value);
    xml << make_nvp("Param4", param4value);
}

加载完成:

bool loadParams(std::string filename)
{
    using boost::serialization::make_nvp;
    std::ifstream ifs(filename.c_str());
    if(ifs.is_open() == false) return false;
    boost::archive::xml_iarchive xml(ifs);

    xml >> BOOST_SERIALIZATION_NVP(param1value);
    xml >> BOOST_SERIALIZATION_NVP(param2value);
    xml >> BOOST_SERIALIZATION_NVP(param3value);
    xml >> BOOST_SERIALIZATION_NVP(param4value);
}

现在我想添加 Param5。 如何在加载时添加额外的版本信息并处理它?我在文档中找到了如何在使用BOOST_CLASS_VERSION(serialized_class, version) 序列化类时执行此操作。

【问题讨论】:

    标签: c++ serialization boost boost-serialization


    【解决方案1】:

    所以我将提出我丑陋的解决方案作为答案。当出现更好的解决方案时,我会接受。

    我已经处理了有例外的版本:

    bool loadParams(std::string filename)
    {
        using boost::serialization::make_nvp;
        std::ifstream ifs(filename.c_str());
        if(ifs.is_open() == false) return false;
        boost::archive::xml_iarchive xml(ifs);
    
        try
        {
           xml >> BOOST_SERIALIZATION_NVP(param1value);
           xml >> BOOST_SERIALIZATION_NVP(param2value);
           xml >> BOOST_SERIALIZATION_NVP(param3value);
           xml >> BOOST_SERIALIZATION_NVP(param4value);
        }
        catch(boost::archive::archive_exception e)
        {
           qDebug()<<"Exception: "<<e.what();
        }
        try
        {
           xml >> BOOST_SERIALIZATION_NVP(newParam);
        }
        catch(boost::archive::archive_exception e)
        {
           qDebug()<<"New version!";
        }
    }
    

    【讨论】:

      【解决方案2】:

      只需为版本创建一个整数并首先对其进行序列化。

      int param_ver = 1;
      xml << BOOST_SERIALIZATION_NVP(param_ver);
      xml << BOOST_SERIALIZATION_NVP(param1value);
      xml << BOOST_SERIALIZATION_NVP(param2value);
      xml << BOOST_SERIALIZATION_NVP(param3value);
      xml << BOOST_SERIALIZATION_NVP(param4value);
      xml << BOOST_SERIALIZATION_NVP(param5value);
      

      加载时先阅读版本并使用

      int param_ver;
      xml >> BOOST_SERIALIZATION_NVP(param_ver);
      xml >> BOOST_SERIALIZATION_NVP(param1value);
      xml >> BOOST_SERIALIZATION_NVP(param2value);
      xml >> BOOST_SERIALIZATION_NVP(param3value);
      xml >> BOOST_SERIALIZATION_NVP(param4value);
      if(param_ver>0)
      {
        xml >> BOOST_SERIALIZATION_NVP(param5value);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-14
        • 1970-01-01
        • 2020-08-23
        • 1970-01-01
        • 2011-08-26
        • 1970-01-01
        • 2011-06-07
        • 1970-01-01
        相关资源
        最近更新 更多