是的,这是今年的情人节,一篇还在研究怎么用的文章,文结的时候应该就用成功了. 恩,要有信心

神奇的分割线


不知何时装过boost库的header-only库, 所以ratslam中的boost是可以编译的,但是我自己试的程序会编译不过, 提示错误是未定义的引用. 所以我就从安装boost库开始.

1. 到www.boost.org下载相应的库, 目前最新是1_60_0版本的链接打开

文件有点大


下载好后就可以安装了.

1. 我将文件解压缩在home目录下命名为BOOST_ROOT目录下.

2. cd BOOST_ROOT

3. ./bootstrap.sh  --help

4. ./bootstrap.sh  --prefix=/usr/local      ##其实默认情况下prefix的值就是/usr/local

这句命令编译可执行文件到/usr/local目录下了,因此后面当你在程序中需要引用头文件依赖时,就在这个路径下

编译会有点慢. 编译完成后会生成bjam可执行文件

5. 编译完成后,安装bjam  ./bjam install


安装完成,可以测试一下以下代码能否成功编译:

demo.cpp

#include <iostream>
#include <string>
#include <sstream> #include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp> #include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp> using namespace std; class Test
{
public: friend class boost::serialization::access; Test(bool b, char ch, int i, double d, string str)
: m_bool(b), m_char(ch), m_int(i), m_double(d), m_str(str)
{
} template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar& m_bool;
ar& m_char;
ar& m_int;
ar& m_double;
ar& m_str;
} private:
bool m_bool;
char m_char;
int m_int;
double m_double;
string m_str;
}; int main()
{
Test test(true, 'm', , 17.89, "fuzhijie"); stringstream binary_sstream;
stringstream text_sstream; long long begin, end; int size; //使用二进制的方式序列化
boost::archive::text_oarchive text_oa(text_sstream);
boost::archive::binary_oarchive binary_oa(binary_sstream); begin = time(NULL);
for(int i = ; i < ; ++i)
{
text_oa << test;
}
end = time(NULL);  //哈,这里时间还可以这样用来计算程序执行时间,Mark size = text_sstream.tellp() / ( * ); cout << "text serialization seconds: " << end - begin << ", space: " << size << endl; begin = time(NULL);
for(int i = ; i < ; ++i)
{
binary_oa << test;
}
end = time(NULL); //以MB为单位
size = binary_sstream.tellp() / ( * ); cout << "binary serialization seconds: " << end - begin << ", space: " << size << endl; return ;
};

编译:

g++ -o main demo.cpp -L/usr/local/lib -lboost_serialization

运行:

./main

会看到执行结果:

text serialization seconds: , space:
binary serialization seconds: , space:

安装成功!


程序解读:

首先,我用的序列化通篇都是嵌入式实现的. (机智的你一定在之前了解过序列化的嵌入式和非嵌入式的区别了)

用serialist的时候的一般步骤是:

  1 先引用头文件,

  2 在类的声明中, 你需要一个序列化函数,该函数的一般格式是:

 template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{ //version是版本号
ar& m_str;
}

这样声明了你要序列化的数据之后, 你就完成了一半了

  3 使用时是这样的, 因为你是要存储真实的数据,而类里面的声明只是告诉程序去序列化哪些变量. 因此, 首先你需要一个类的实例, 对象的创建过程中, 可以在任何时候给它的变量赋值,文上的程序是在初始化列表赋值的.

   当你有了一个对象时, 你就有了明确要保存的数据了

  4 定义一个序列化的对象

boost::archive::text_oarchive text_oa(text_sstream);//文本方式
boost::archive::binary_oarchive binary_oa(binary_sstream);//二进制方式

  文末附: 何时用文本方式何时用二进制文件

  5 定义了序列化对象, 就可以将数据流写入了

binary_oa << test;    //将对象test的序列化数据以二进制存储形式写入内存

  这样, 一个数据的序列化程序就完成了. 但是对于我这个还在学习C++的人来说, 似乎对容器和模板的操作没有很熟练啊, 如果要想序列化STL容器该怎么办呢?

 序列化STL容器

#include<boost/serialization/list.hpp>
class bus_route
{
friend class boost::serialization::access;
std::list<bus_stop> stop;
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & stop; //会自动加上容器的长度
}
public:
bus_route(){}
};

这样序列化的声明就完成了

使用时,在主函数中

{
std::ofstream ofs( "store.dat" );
boost::archive::text_oarchive ar(ofs); ar & lv; //lv是你上面声明序列化的那个类的对象
ofs.close();
}

ps:序列化写完之后要用到FOREACH遍历一遍vector template, 记得是自己用的第一个或者第二个boost函数有些笔记的,然很开心来找,发现只有个标题的草稿,真想抽死自己,这个写完去填foreach的坑呀

附: 二进制文件文本文件的选择

1、二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放,也就是说存放的是数据的原形式。

2、文本文件是把数据的终端形式的二进制数据输出到磁盘上存放,也就是说存放的是数据的终端形式。

一、如果要存储字符数据,无论是放在文本文件还是放在二进制文件中都和内存中的数据形式是没有区别的.同样也和终端形式没有区别。那么在存储和显示的特性上也没有任何区别,不浪费存储空间也不浪费转换时间。所以如果一个文件只存放字符数据,那么讨论该文件是用文本文件或是二进制文件是没有任何意义的。

二、如果要存储非字符数据,则情况要复杂一些。

1、如果您需要频繁地保存和访问数据.那么应该采用二进制文件进行存放,这样可以节省存储空间和转换时间。

2、如果您需要频繁地向终端显示数据或从终端读人数据,那么应该采用文本文件进行存放,这样可以节省转换时间。windows中文本方式写时,存在''\n''->''\r\n''的转换,而二进制方式无转换.文本方式读时存在''\r\n''->至''\n''的转换,而二进制方式无转换.

linux中文本方式的读写与二进制方式的读写无差别,不存在回车换行间的转换.这样当直接在windows和linux中共享文件时,将会出现与回车换行相关的问题

C++ | boost库 类的序列化的更多相关文章

  1. boost库----enable_shared_from_this类的作用和实现原理

    使用boost库时,经常会看到如下的类 class A:public enable_share_from_this<A> 在什么情况下要使类A继承enable_share_from_thi ...

  2. (七)boost库之单例类

    (七)boost库之单例类 一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一 ...

  3. 漫步Facebook开源C++库Folly之string类设计(散列、字符串、向量、内存分配、位处理等,小部分是对现有标准库和Boost库功能上的补充,大部分都是基于性能的需求而“重新制造轮子”)

    就在近日,Facebook宣布开源了内部使用的C++底层库,总称folly,包括散列.字符串.向量.内存分配.位处理等,以满足大规模高性能的需求. 这里是folly的github地址:https:// ...

  4. [C/C++] C/C++延伸学习系列之STL及Boost库概述

    想要彻底搞懂C++是很难的,或许是不太现实的.但是不积硅步,无以至千里,所以抽时间来坚持学习一点,总结一点,多多锻炼几次,相信总有一天我们会变得"了解"C++. 1. C++标准库 ...

  5. json 对c++类的序列化(自动生成代码)

    [动机] 之前写网络协议的时候,使用的是google protobuf,protobuf不但在性能和扩展性上有很好的优势,protoc自动生成c++类代码的工具,这点确实给程序员带来了很多便利. 做后 ...

  6. boost库(条件变量)

    1相关理念 (1)类名 条件变量和互斥变量都是boost库中被封装的类. (2)条件变量 条件变量是thread库提供的一种等待线程同步的机制,可实现线程间的通信,它必须与互斥量配合使用,等待另一个线 ...

  7. boost库区间range基本原理及使用实例

    由 www.169it.com 搜集整理 区间的概念类似于STL中的容器概念.一个区间提供了可以访问半开放区间[first,one_past_last)中元素的迭代器,还提供了区间中的元素数量的信息. ...

  8. boost库在windows下的编译和使用

    因为跨平台的原因,现在要使用到boost库,boost库非常大,现在处于摸索阶段. 首先来说boost库在window下的安装和使用. 一.下载 首先从boost官方主页http://www.boos ...

  9. Boost库

    2014-08-31 Boost库是一个经过千锤百炼.可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一.Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成 ...

随机推荐

  1. 《30天自制操作系统》12_day_学习笔记

    harib09a: 定时器:(Timer)每隔一段时间,会向CPU发送一个中断.这样CPU不用记住每一条指令的执行时间.没有定时器很多指令CPU都很难执行.例如HLT指令,这个指令的执行时间不是个固定 ...

  2. JAVA经典算法40题(1-20)

    [程序1]   题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?   1.程序分析:   兔子的规律 ...

  3. YII2.0--------这篇文章记录我学习YII2.0的过程吧,也可以让更多的人少走弯路

    1.情况:今天我从github上下载了一个项目,本以为直接丢到根目录运行就行了,但是不行. 解决办法:首先安装git,安装步骤这里不讲了,稍微讲一下配置环境变量.

  4. 简单Hosts使用说明

    1.查找hosts文件 首先,点击桌面的"我的电脑",或者是通过开始菜单进入到我的电脑. 之后,进入到"C:\Windows\System32\drivers\etc&q ...

  5. geckodriver v0.11.0 github上下载的

    从 https://github.com/mozilla/geckodriver/releases 下载的.家里下载不了,selenium 3.0.1 + python 2.7.10 + firefo ...

  6. Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags

    有3个对象,对象A,对象B,对象C.他们的实体关系为: 1.A中存在List<B>和List<C>,即一个包含另外两个: 2.A中存在List<B>,B中存在Lis ...

  7. YOU KNOW NOTHING , SNOW

    JVM运行时数据区域 方法区: 用 于存储虚拟机加载的类信息,常量,静态变量,JIT编译后的代码,所有线程共享 堆:所有线程共享,用来存储实例对象. 虚拟机栈:线程私有,生命周期与线程相同,每个方法被 ...

  8. 利用angular与后台的交互

    记录的世界是强大的,不管天南海北还是五湖四海,如果利用angular js与后台的交互.angular js 在api上称为是http服务: 下面咱给一个简单的代码看看:简单的利用后台与前端的tab切 ...

  9. TortoiseSVN安装使用

    TortoiseSVN是windows平台下Subversion的免费开源客户端. 一般我们都是先讲讲服务器的配置,然后再讲客户端的使用,但是在TortoiseSVN上,却可以反过来.因为,如果你的要 ...

  10. js与jquery的用法

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />后面加上 ...