由于项目需求需要传输结构化的数据,但是我们进行socket通信时,利用recv和send函数处理的都是序列化的
数据,如何利用socket进行结构化的数据传输呢?这里就用到了我们现在要总结一下的boost库,boost是一个
开源的准标准的模板库,里面就提供了我们这里需要的序列化和反序列化的工具。话不多说,现在开始!
要使用boost库,首先需要的就是安装:
我们可以在终端中直接安装:
sudo apt-get install libboost1.46
当然我们也可以直接用源码的方式安装,这样的好处就是可以获得最新的boost库,现在已经出到了boost_1.51_0
可以从这个网址下载需要的版本:http://www.boost.org/
下载完成后之后
cd ~/下载
tar -zxvf boost_1.51_0.tar.gz
cd boost_1.51_0
解压之后进入boost_1.51_0,其实boost的库分为两个部分一个是无需编译的一部分需要手动进行编译的部分,
新的版本中我们只需要在文件夹下面直接运行:
./bootstrap.sh
就ok了,哦对了 这个安装需要python的运行环境,因为需要在安装之前需要,安装python!
下面就是我验证过得例子:
#include
#include
#include
#include
#include
#include
using namespace std;
class VECTOR
{
public:
vector v;
friend class boost::serialization::access;
template
void serialize (Archive & ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_NVP (v);
}
};
int main ()
{
VECTOR vi, vi3;
vi.v.push_back (10);
vi.v.push_back (11);
vi.v.push_back (12);
vi3.v.push_back (20);
VECTOR vi2;
ofstream ofs ("hehe");
boost::archive::xml_oarchive oa (ofs);
oa << BOOST_SERIALIZATION_NVP (vi);
oa << BOOST_SERIALIZATION_NVP (vi3);
ofs.close ();
ifstream ifs ("hehe");
boost::archive::xml_iarchive ia (ifs);
ia >> BOOST_SERIALIZATION_NVP (vi2);
for (vector::size_type i=0 ; i != vi2.v.size(); i++)
cout << vi2.v[i] << endl;
cout << "----------------\n";
ia >> BOOST_SERIALIZATION_NVP (vi2);
for (vector::size_type j=0 ; j != vi2.v.size() ; j++)
cout << vi2.v[j] << endl;
ifs.close ();
}
在例子我们对于类VECTOR进行了序列化的操作,我们要对类中的私有成员进行序列化操作需要:引入友元函数
friend class boost::serialization::access;ar & BOOST_SERIALIZATION_NVP (v);关于符号&代表这个函数既可以进行序列化也可进行反序列化!
这里关于boost里面有很多的操作还是非常有助于我们编程的提高的,值得我们深入研究!