最近在研究boost这个库,这个库很强大,鉴于工作的需要,我花了点时间学习了下boost库里的序列化机制,个人感觉很强大,boost库对序列化这块支持的范围很广,其中对于xml这方面的序列化机制感觉支持的很不错,下面就从最基础的开始吧,代码如下:
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/list.hpp>
#include <iostream>
#include <fstream>
void save()
{
std::ofstream file("archive.txt");
boost::archive::text_oarchive oa(file);
std::string s = "Hello world";
//oa << s;
oa & s;
}
void load()
{
std::ifstream file("archive.txt");
boost::archive::text_iarchive ia(file);
std::string s;
//ia >> s;
ia & s;
std::cout << s << std::endl;
}
在boost中比较常用的序列化机制主要分为文本时和二进制形式,而文本时的序列化机制又分为了纯文本式和xml式,而上面的例子就是一个纯文本式的序列化机制,里面用到了boost库的text_oarchive和text_iarchive,并且在用boost做序列化时我们一般都会设置一些序列化载体,纯文本式的序列化机制其载体就是单个的纯文本文件,而xml式的载体则是xml文件,至于二进制序列化其载体就不确定了,一般都是内存buffer结构,有时也会写文件,在上述代码中,我们首先定义好了载体,然后与相应的序列化对象进行关联,并通过相应的运算符操作来实现相关的序列化操作,接下来,我们来看看xml式的序列化机制,代码如下:
void save_XML()
{
std::ofstream file("test.xml");
boost::archive::xml_oarchive oa(file);
std::string s = "Hello world";
oa & BOOST_SERIALIZATION_NVP(s);
}
void load_XML()
{
std::ifstream file("test.xml");
boost::archive::xml_iarchive ia(file);
std::string s;
ia & BOOST_SERIALIZATION_NVP(s);
std::cout << s <<std::endl;
}
在以xml为载体的序列化中,会使用到xml_oarchive和xml_iarchive,并且还会使用到BOOST_SERIALIZATION_NVP这个宏,在这个地方我们先不对这些对象以及宏进行深入讨论,在下篇博文中,我们会深入分析boost库的Serialization这个类,接下来,我们稍微来看看基于xml式序列化机制的一些测试用例吧,代码如下:
1. 针对数组和STL
void save_Array()
{
std::ofstream file("test1.xml");
boost::archive::xml_oarchive oa(file);
int array1[] = {12,23,34,4,343};
oa & BOOST_SERIALIZATION_NVP(array1);
}
void load_Array()
{
std::ifstream file("test1.xml");
boost::archive::xml_iarchive ia(file);
int restored[5];
ia & BOOST_SERIALIZATION_NVP(restored);
std::ostream_iter