提升不同版本的序列化作用域

Boost serialization cope of different versions

本文关键字:序列化 作用域 版本      更新时间:2023-10-16

我正在使用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)序列化时如何做到这一点。

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

我处理过有例外的版本:

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!";
    }
}

只需为版本创建一个整数并首先序列化它。

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);
}