boost 序列化成 xml文件

来源:互联网 发布:phpstudy切换php版本 编辑:程序博客网 时间:2024/04/29 16:30

#include "stdafx.h"

#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/serialization/map.hpp>
#include <fstream>
#include <iostream>

class TestClass
{
public:
    TestClass()
    {
        m_cMember1 = 'm';
        m_strMemberName = "Hello.";
        m_nData = 1;
    }

    char m_cMember1;
    std::string m_strMemberName;
    int m_nData;

    // 串行化的函数,这一个函数完成对象的保存与恢复
    template<class Archive>
    void serialize(Archive& ar, const unsigned int version)
    {
        // 注意这个宏(变量名存储进去, XML文件的节点将作为节点的名称)
        ar & BOOST_SERIALIZATION_NVP(m_cMember1);
        ar & BOOST_SERIALIZATION_NVP(m_strMemberName);
        ar & BOOST_SERIALIZATION_NVP(m_nData);
    }
};

typedef std::map<std::string, TestClass> MapTestClass;

int _tmain(int argc, _TCHAR* argv[])
{
    MapTestClass mapTestClass;
    /////////////////////////////////////////////////////////////////
    // 读取xml文件中的数据
    //读取Member.xml文件以初始化表示用户信息的m_mapUserinfo
    std::ifstream fin("./abc.xml");
    if (fin)
    {
        boost::archive::xml_iarchive ia(fin);           // 文本的输入归档类
        // 注意这一段宏, 在读操作时mapTestClass的命名无所谓,
        // 估计boost库中会查找与该结构"匹配"的数据来读写
        ia >> BOOST_SERIALIZATION_NVP(mapTestClass);    // 恢复到m_mapUserinfo对象
        fin.close();
        return 0;
    }

    /////////////////////////////////////////////////////////////////
    mapTestClass["justTest"].m_strMemberName = "test----";

    /////////////////////////////////////////////////////////////////
    // 写入数据
    std::ofstream fout("./abc.xml");
    if (fout)
    {
        // 注意这一段宏, 在读操作时mapTestClass的命名无所谓,
        // 估计boost库中会查找与该结构"匹配"的数据来读写
        // 但在写入文件时, 如果mapTestClass这个命名有一些特殊符号
        // 例如: ::mapTestClass, *mapTestClass , 此时写入数据就会
        // 报错, 因为*mapTestClass传入时, xml的节点的名称就是
        // "*mapTestClass"了, 这样会造成异常
        boost::archive::xml_oarchive oa(fout);          // 文本的输出归档类,使用一个ostream来构造
        oa << BOOST_SERIALIZATION_NVP(mapTestClass);    // 保存obj对象
        fout.close();                                   // 关闭文件
        return 0;
    }

    system("pause");
    return 0;
}

 

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="5">
<mapTestClass class_id="0" tracking_level="0" version="0">
 <count>1</count>
 <item_version>0</item_version>
 <item class_id="1" tracking_level="0" version="0">
  <first>justTest</first>
  <second class_id="2" tracking_level="0" version="0">
   <m_cMember1>109</m_cMember1>
   <m_strMemberName>test----</m_strMemberName>
   <m_nData>1</m_nData>
  </second>
 </item>
</mapTestClass>

原创粉丝点击