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 ...
随机推荐
- xml去除指定节点,保留子节点操作
现有xml文件: <?xml version="1.0" encoding="utf-8" ?> <ShiftConfig xmlns:xsi ...
- 用户ID的代码生成
public class Uid { private static final String machineIdString = Integer.toHexString(new Object().ha ...
- THREADSPOOL
STPStartInfo stp = new STPStartInfo();//线程详细配置参数 stp.CallToPostExecute = CallToPostExecute.Always;// ...
- DB2检测表字段改动的方法(不用触发器)
ALTER TABLE TEST ADD COLUMN RTS TIMESTAMP NOT NULL GENERATED ALWAYS FOR EACH ROW ON UPDATE AS ROW CH ...
- 有关View的几个基础知识点-IOS开发
转自:http://blog.csdn.net/iukey/article/details/7083165 我一般情况下不会使用interface builder去画界面,而是用纯代码去创建界面,不是 ...
- mac 写NTFS磁盘
最简单的方法就是把 OS X 自带的 mount_ntfs 默认加载方式从只读改成读写, 具体方法如下 # 用 root 身份做如下操作 (高危! 请切记自己在干什么)sudo -s cd /sbin ...
- Netty 源码分析之 番外篇 Java NIO 的前生今世
简介 Java NIO 是由 Java 1.4 引进的异步 IO. Java NIO 由以下几个核心部分组成: Channel Buffer Selector NIO 和 IO 的对比 IO 和 NI ...
- httpclient4.5 的一些细节
本文转自:http://mercymessi.iteye.com/blog/2250161 httpclient是Apache下的一个用于执行http网络访问的一个工具包. 大致流程:新建一个http ...
- tiny4412 u-boot 启动参数的设置
参考 http://www.cnblogs.com/chenfulin5/p/5887552.html 制作SD卡 u-boot 编译完之后, 进入 u-boot 目录里面的 sd_fuse cd ~ ...
- maven编译插件版本配置案例
<!-- Build Settings 构建设置 --> <build> <finalName>${project.artifactId}</finalNam ...