boost::archive::text_oarchive
Serialization的中文解释是“串行化” 、“序列化”或者“持久化” ,就是将内存中的对象保存到磁盘中,等到程序再次运行的时候再读取磁盘中的文件恢复原来的对象。下面来看一个简单的例子:
#include <fstream>
#include <iostream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
class A
{
private:
// 为了能让串行化类库能够访问私有成员,所以要声明一个友元类
friend class boost::serialization::access;
// 对象的数据
int a;
double b;
// 串行化的函数,这一个函数完成对象的保存与恢复
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & a; //就是这么简单,也可以使用 ar<<a 这样的语法
ar & b;
}
public:
A(int aa,double bb):a(aa),b(bb){}
A(){}
void print(){std::cout<<a<<' '<<b<<std::endl;}
};
int main()
{
std::ofstream fout("file.txt");// 把对象写到file.txt文件中
boost::archive::text_oarchive oa(fout); // 文本的输出归档类,使用一个ostream来构造
A obj(,2.5);
oa<<obj; // 保存obj对象
fout.close();// 关闭文件 std::ifstream fin("file.txt");
boost::archive::text_iarchive ia(fin); // 文本的输入归档类
A newobj;
ia>>newobj; // 恢复到newobj对象
newobj.print();
fin.close();
system("pause");
return ;
} 从上面可以看出,boost是使用text_oarchive和text_iarchive 类,来完成一个对象的序列化的。使用这两个类的步骤是:
. 在源程序中包含boost/archive/text_oarchive.hpp 和 boost/archive/text_iarchive.hpp 这两个文件。
. 为需要序列化的类添加一个template<class Archive> void serialize(Archive & ar, const unsigned int version)的模版成员函数。
. 如果需要对象中包含私有成员的话,需要把boost::serialization::access类声明为友元。
. 在主函数中,创建一个输出文件流对象, 使用这个对象构造一个text_oarchive对象,然后就可以使用<<操作符来输出对象了。
. 最后,同样的,使用text_iarchive来恢复对象。 继承
如果要序列化一个子类的话,方法是不同的。例:
#include <boost/serialization/base_object.hpp> //一定要包含此头文件
class B:A
{
friend class boost::serialization::access;
char c;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & boost::serialization::base_object<A>(*this); // 注意这里
ar & c;
}
public:
...
}; 对子类进行序列化的步骤是:
. 包含boost/serialization/base_object.hpp头文件
. 在serialize模版函数中,使用ar & boost::serialization::base_object<父类>(*this)这样的语法来保存父类的数据,不能直接调用父类 的serialize函数 STL容器
如果要序列化一个STL容器,要使用boost自带的头文件,不能直接#include<vector>
例如:
#include <boost/serialization/list.hpp> // Serialization中特定的头文件,在list.hpp中已经包含了stl的list头文件
Class A
{
...
list<int> list;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & list;
}
...
}
在Serialization中,类似的头文件还有vector.hpp string.hpp set.hpp map.hpp slist.hpp等等。 数组和指针
对于数组和指针可以直接序列化,例:
Class A
{
...
int a[];
int *b
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & a;
ar & b;
}
...
} 其他的archive类
除了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\archive\binary_iarchive二进制流
boost::archive::text_oarchive的更多相关文章
- boost::archive::binary_iarchive
#include <iostream> #include <string> #include <sstream> #include <vector> # ...
- C++ | boost库 类的序列化
是的,这是今年的情人节,一篇还在研究怎么用的文章,文结的时候应该就用成功了. 恩,要有信心 神奇的分割线 不知何时装过boost库的header-only库, 所以ratslam中的boost是可以编 ...
- boost序列化
#include <iostream> #include <boost/serialization/serialization.hpp> #include <boost/ ...
- Boost的Serialization和SmartPoint搭配使用
准确来说,这篇博文并不是译文,而是一篇某个网页中代码改写而来.原文章中的代码存在几处严重错误,网页又不提供留言功能(不是没有而是一个没有留言功能的留言板).4年过去了,作者对这些错误不更正让人无法接受 ...
- Boost 序列化
原文链接: https://blog.csdn.net/qq2399431200/article/details/45621921 1. 编译器 gcc, boost 1.55 2.1第一个简单的例子 ...
- boost常用库案例
1.boost::any boost::any是一种通用的数据类型,可以将各种类型包装后统一放入容器内,最重要的它是类型安全的.有点象COM里面的variant. 使用方法: any::type() ...
- boost serialize序列化
boost序列化 #ifndef FND_SERI_H #define FND_SERI_H #include <boost/archive/text_oarchive.hpp> #inc ...
- 测试了下boost的序列化反序列化功能
// testSerialization.cpp : Defines the entry point for the console application. // #include "st ...
- 如何在C++中使用boost库序列化自定义class ?| serialize and deserialize a class in cpp with boost
本文首发于个人博客https://kezunlin.me/post/6887a6ee/,欢迎阅读! serialize and deserialize a class in cpp Guide how ...
随机推荐
- AFLW如何获取你想要的21点人脸关键点数据
目前人脸检测和人脸的关键点的数据库根据关键点个数:5,20,21,29,68等.https://blog.csdn.net/XZZPPP/article/details/74939823该网页详细列出 ...
- UVA10624 - Super Number(dfs)
题目:UVA10624 - Super Number(dfs) 题目大意:给你n和m要求找出这种m位数,从第n位到第m位都满足前i位是能够被i整除,假设没有这种数,输出-1.有多个就输出字典序最小的那 ...
- Lintcode---把排序树组转换为高度最小的二叉树
给一个排序数组(从小到大),将其转换为一棵高度最小的排序二叉树. 注意事项 There may exist multiple valid solutions, return any of them. ...
- apache虚拟主机设置泛域名的方法
在apache虚拟主机中设置泛域名解析,主要是用到ServerAlias 的配置. 1.支持多域名 例如,让mail.jbxue.org.smtp.jbxue.org.pop3.jbxue.org 都 ...
- [elk]logstash统计api访问失败率
处理原始日志 日志从moogoo导出来的 { "mobile" : "13612345678", "isp" : "中国移动_广东 ...
- nyoj 38 布线问题 Kruskal and Prim
布线问题 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件: 1.把所有的 ...
- UITableView__cell 距tableview顶端有间距
UITableView__cell 距tableview顶端有间距 如何去掉这个间距呢?解决方法如下: //top 为cell距顶端的间距 (一般为负值) self.formTable.con ...
- 基于jQuery页面窗口拖动预览效果
今天给大家分享一款基于Query页面窗口拖动预览效果.这是一款基于jQuery+HTML5实现的模拟页面窗口显示拖动窗口预览特效.这款实例适用浏览器:IE8.360.FireFox.Chrome.Sa ...
- Groovy学习()起步
安装Groovy 在Windows环境下安装Groovy 下载安装包,傻瓜安装,设置环境目录,就这样搞定. 另外还需要安装Java并且设置JAVA_HOME环境变量. 两分钟搞定. 使用groovys ...
- Android——Activity中的六个主要函数
Android Activity中的六个主要函数 Android中一个Activity一般都需要实现六个函数: onCreate(), onStart(), onResume(),onPause(), ...