使用 boost 序列化从 XML 加载类

Posted

技术标签:

【中文标题】使用 boost 序列化从 XML 加载类【英文标题】:Loading a class from XML with boost serialization 【发布时间】:2011-04-20 10:48:38 【问题描述】:

我正在尝试从 XML 文件加载一个简单的类,但收到以下错误:

error: no match for 'operator>>' in 'xml >> boost::serialization::make_nvp(const
char*, T&) [with T = Options](((Options&)(& o)))'

我做错了一定是愚蠢的,但我不知道是什么。有人有想法吗?这是我的代码:

#include <fstream>
#include <boost/serialization/string.hpp>
#include <boost/serialization/map.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/serialization/nvp.hpp>

class Options 
public:
    Options() 
        SetInteger("screenWidth", 1024);
        SetInteger("screenHeight", 768);
    
    void SetInteger(const std::string& name, int value) 
        integers_[name] = value;
    
private:
    std::map<std::string, int> integers_;

    friend class boost::serialization::access;
    template<class archive>
    void serialize(archive& ar, const unsigned int version)
    
        using boost::serialization::make_nvp;
        ar & make_nvp("integers", integers_);
    
;

int main() 
    Options o;
    std::ofstream ifs("input.xml");
    boost::archive::xml_oarchive xml(ifs);
    xml >> boost::serialization::make_nvp("options", o); // error

【问题讨论】:

【参考方案1】:

从您的代码和您正在编写的内容来看,您正在尝试阅读。在这种情况下,您不应使用 ofstream 和 xml_oarchive,而应使用 ifstreamxml_iarchive

#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>

....

//for read
std::ifstream ifs("input.xml");
boost::archive::xml_iarchive xmlIn(ifs);
xmlIn >> boost::serialization::make_nvp("options", o); 

//for write
std::ofstream ofs("output.xml");
boost::archive::xml_oarchive xmlOut(ofs);
xmlOut << boost::serialization::make_nvp("options", o); 

【讨论】:

以上是关于使用 boost 序列化从 XML 加载类的主要内容,如果未能解决你的问题,请参考以下文章

boost::archive::xml_oarchive 中的 class_id

C++ Boost 序列化、构造函数和数据复制

boost 序列化多态类

使用Boost将派生类部分反序列化为基类时输入流错误

boost::boost::unordered_map 的序列化

如何在 boost 序列化中更改或删除标签?