提升不同版本的序列化作用域
Boost serialization cope of different versions
我正在使用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);
}
相关文章:
- 在类函数中初始化外部作用域变量
- "变量":函数中函数作用域不允许初始化的自动或寄存器变量'naked'
- 函数作用域是静态变量还是线程本地变量在C++11中的第一个条目中初始化
- 使用作用域内生成的指针初始化静态成员
- 主线程中块作用域static与命名空间作用域thread_local的初始化和销毁顺序
- 在c++中,全局作用域中只允许"表达式"初始化全局对象.我在哪里可以在标准中找到这个
- 使用 fwrite/fread 对矩阵进行二进制(反)序列化不起作用
- 未在此作用域中声明实例化类/的作用域
- 有没有一个C++版本在循环结束后将在for循环初始化中声明的变量保留在作用域中
- 使用具有相同名称的(无作用域)基类枚举初始化派生类枚举
- 函数作用域的静态非 Pod 对象初始化
- 是一个初始化为未确定值或未初始化的本地作用域变量
- 是块作用域静态或线程存储持续时间变量初始化失败的原因
- 为什么可以在没有初始化项的情况下跳转到标量类型对象的作用域?
- 静态成员初始化器的Lambda作用域
- 隐式实例化取决于作用域或非作用域枚举
- 位域的二进制"bulk"序列化
- 如何在涉及依赖作用域的内部类时C++查找模板化函数标头
- 扩展在if/else序列中初始化的变量的作用域
- 提升不同版本的序列化作用域