#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>
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cay22/archive/2009/07/28/4386394.aspx