拿到BOOST库,想使用其中的串行化的类库Serialization,于是首先得将它构建出来:
1. 编译BOOST之Serialization库
由于我使用的是VS2003.NET首先想到的是打开boost_root/libs/serialization/
vc7ide/BoostSerializationLibrary.sln,编译Library.vcproj之后得到了boost_wserialization-vc
71-mt-gd.lib这个库文件.
按照BOOST自带的Tutorial,编写了它的测试代码如下:
#include "stdafx.h"
#include <fstream>
// include headers that implement a archive in simple text format
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
/
// gps coordinate
//
// illustrates serialization for a simple type
//
class gps_position
{
private :
friend class boost::serialization::access;
// When the class Archive corresponds to an output archive, the
// & operator is defined similar to <<. Likewise, when the class Archive
// is a type of input archive the & operator is defined similar to >>.
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & degrees;
ar & minutes;
ar & seconds;
}
int degrees;
int minutes;
float seconds;
public :
gps_position(){};
gps_position(int d, int m, float s) :
degrees(d), minutes(m), seconds(s)
{}
};
int main() {
// create and open a character archive for output
std::ofstream ofs("filename" );
boost::archive::text_oarchive oa(ofs);
// create class instance
const gps_position g(35, 59, 24.567f );
// write class instance to archive
oa << g;
// close archive
ofs.close();
// ... some time later restore the class instance to its orginal state
// create and open an archive for input
std::ifstream ifs("filename" , std::ios::binary);
boost::archive::text_iarchive ia(ifs);
// read class state from archive
gps_position newg;
ia >> newg;
// close archive
ifs.close();
return 0 ;
}
#include <fstream>
// include headers that implement a archive in simple text format
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
/
// gps coordinate
//
// illustrates serialization for a simple type
//
class gps_position
{
private :
friend class boost::serialization::access;
// When the class Archive corresponds to an output archive, the
// & operator is defined similar to <<. Likewise, when the class Archive
// is a type of input archive the & operator is defined similar to >>.
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & degrees;
ar & minutes;
ar & seconds;
}
int degrees;
int minutes;
float seconds;
public :
gps_position(){};
gps_position(int d, int m, float s) :
degrees(d), minutes(m), seconds(s)
{}
};
int main() {
// create and open a character archive for output
std::ofstream ofs("filename" );
boost::archive::text_oarchive oa(ofs);
// create class instance
const gps_position g(35, 59, 24.567f );
// write class instance to archive
oa << g;
// close archive
ofs.close();
// ... some time later restore the class instance to its orginal state
// create and open an archive for input
std::ifstream ifs("filename" , std::ios::binary);
boost::archive::text_iarchive ia(ifs);
// read class state from archive
gps_position newg;
ia >> newg;
// close archive
ifs.close();
return 0 ;
}
将编译出来的boost_serialization-vc71-mt-gd.lib加入到库路径当中编译出现有缺少boost_serialization-vc71-sgd.lib这个文件,于是想办法来从上面的BoostSerializationL
ibrary.sln中得到该库文件,但是未果.
后来利用网上的办法利用bjam来进行构建,但是听说全部构建需要将近三四个小时的时间,我不想要全部构建,只想得到关于serialization的相关的库文件,于是产生了下面的SHELL命令:
set VC71_ROOT=D:/Program Files/Microsoft Visual Studio .NET 2003/Vc7
bjam -sTools=vc71 "sVC71_ROOT=D:/Program Files/Microsoft Visual Studio .NET 2003/Vc7" --with-serialization stage
将这些做成make.bat放于boost的目录下面,于是编译,将近有10分钟后在boost/stage/libs下面会出现serialization的相关的所有库文件,将这引起库文件放置于VC的库路径下,编译上面的测试代码则顺利通过.
2. 分析serialization测试代码
在类gps_positin当中定义了一个
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & degrees;
ar & minutes;
ar & seconds;
}
void serialize(Archive & ar, const unsigned int version)
{
ar & degrees;
ar & minutes;
ar & seconds;
}
std::ofstream ofs("filename"
);
boost::archive::text_oarchive oa(ofs);
boost::archive::text_oarchive oa(ofs);
当中我们可以看到定义了一个输出文件流ofs,并且定义了一个文本媒质,这个媒质挂载了输出文件流ofs.
oa <<
g;
ia >> newg;
ia >> newg;
使得oa成为了文本filename与g之间的桥梁,将g的内容与入到filename当中,ia从filename当中将g读出.