#include <fstream>
#include <iostream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
//参考http://www.cnblogs.com/wubiyu/archive/2009/01/09/1372582.html
//编译参数加上 -lboost_serialization
class gps_position {
private:
friend class boost::serialization::access;
//必须要实现序列化的方法,可以自己添加vector list成员变量去处理多个数据
template<class Archive>
void serialize(Archive &ar, const unsigned int version) {
ar & degrees;
ar & minutes;
ar & seconds;
}
public:
int degrees;
int minutes;
float seconds;
gps_position() {
};
gps_position(int d, int m, float s) : degrees(d), minutes(m), seconds(s) {
}
};
//序列化一个对象
void test001() {
std::ofstream ofs("serialize.log");
boost::archive::text_oarchive oa(ofs);
const gps_position g(35, 59, 24.56);
oa << g;
ofs.close();
std::ifstream ifs("serialize.log", std::ios::binary);
boost::archive::text_iarchive ia(ifs);
gps_position newg;
ia >> newg;
std::cout << newg.degrees << "\t" << newg.minutes << "\t" << newg.seconds << std::endl;
ifs.close();
}
//序列化子类
#include <boost/serialization/base_object.hpp> //一定要包含此头文件
class child : public gps_position {
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version) {
ar & boost::serialization::base_object<gps_position>(*this); //注意这里
ar & val;
}
public:
int val;
void setValue(int d, int m, float s) {
degrees = d;
minutes = m;
seconds = s;
}
};
//序列化子类
void test002() {
std::ofstream ofs("serialize_child.log");
boost::archive::text_oarchive oa(ofs);
child g;
g.setValue(35, 59, 24.56);
g.val = 100;
oa << g;
ofs.close();
std::ifstream ifs("serialize_child.log", std::ios::binary);
boost::archive::text_iarchive ia(ifs);
child newg;
ia >> newg;
std::cout << newg.degrees << "\t" << newg.minutes << "\t" << newg.seconds << "\t" << newg.val << std::endl;
ifs.close();
}
//序列化一个STL容器,要使用boost自带的头文件,不能直接#include<vector>
#include <boost/serialization/list.hpp>// Serialization中特定的头文件,在list.hpp中已经包含了stl的list头文件
//在Serialization中,类似的头文件还有vector.hpp string.hpp set.hpp map.hpp slist.hpp等等。
class seri_list {
std::list<int> m_list;
template<class Archive>
void serialize(Archive & ar, const unsigned int version) {
ar & m_list;
}
public:
void setList(std::list<int> values) {
m_list = values;
}
};
using namespace std;
void test003() {
std::cout << "test003()" << std::endl;
std::ofstream ofs("serialize_stl.log");
boost::archive::text_oarchive oa(ofs);
std::list<int> values;
values.push_back(11);
values.push_back(12);
values.push_back(13);
for (list < int > ::iterator it = values.begin(); it != values.end(); ++it) {
cout << *it << ' ';
}
cout << endl;
oa << values;
ofs.close();
std::ifstream ifs("serialize_stl.log", std::ios::binary);
boost::archive::text_iarchive ia(ifs);
std::list<int> newg;
ia >> newg;
std::cout << newg.size() << std::endl;
for (list < int > ::iterator it = newg.begin(); it != newg.end(); ++it) {
/**char str[1024]={0};
sprintf(str,"%d",tmp);
execl("/root/dlg.py",str);*/
cout << *it << ' ';
}
cout << endl;
ifs.close();
}
//对于数组和指针可以直接序列化
class A {
int a[10];
int *b;
template<class Archive>
void serialize(Archive & ar, const unsigned int version) {
ar & a;
ar & b;
}
};
/**
* 除了text_iarchive和text_oarchive之外,还有其他的archive类,可以把对象保存成不同格式的文件。
// a portable text archive
boost::archive::text_oarchive(ostream &s) // saving
boost::archive::text_iarchive(istream &s) // loading
// a portable text archive using a wide character stream
boost::archive::text_woarchive(wostream &s) // saving
boost::archive::text_wiarchive(wistream &s) // loading
// a non-portable native binary archive
boost::archive::binary_oarchive(ostream &s) // saving
boost::archive::binary_iarchive(istream &s) // loading
// a portable XML archive
boost::archive::xml_oarchive(ostream &s) // saving
boost::archive::xml_iarchive(istream &s) // loading
// a portable XML archive which uses wide characters - use for utf-8 output
boost::archive::xml_woarchive(wostream &s) // saving
boost::archive::xml_wiarchive(wistream &s) // loading
*/
//操作boost容器
#include <boost/ptr_container/ptr_container.hpp>
#include <iterator>
void test005() {
boost::ptr_vector<int> myVector;
myVector.push_back(new int(1));
myVector.push_back(new int(3));
myVector.push_back(new int(4));
myVector.push_back(new int(5));
myVector.push_back(new int(6));
myVector.push_back(new int(2));
std::copy(myVector.begin(), myVector.end(), std::ostream_iterator<int>(std::cout, ","));
}
int main(int argc, char* argv[]) {
std::cout << argv[0] << std::endl;
test001();
test002();
test003();
test005();
return 0;
}
boost serialization
最新推荐文章于 2022-03-10 22:39:13 发布