对象序列化之Boost.Serialization

最近在写基于海量点云数据建模程序时,碰到一个效率问题;整个建模过程是管道线方式,这里简单地看作是两步,第一步就是生成所需的数据,第二步即是基于这些生成的数据建模;目前所做的工作就是写第二步,第一步的操作不需要变动,这就造成每次对第二步进行修改(再编译链接后执行)后,重新生成所需数据,而这个生成过程是相当缓慢的,从而给开发调试阶段造成极大的时间浪费。

于是就想到了对象序列化,而对象序列化有好几种方案,常用的有Google Protocol Buffers(protobuf)、Boost.Serialization、MFC,而对于支持STL且效率较高的序列化方法,Boost.Serialization是个不错的选择。关于Boost.Serialization的介绍,这位美女 以及这篇文章 介绍的比较清楚,我就对其中一点遗漏进行补充。

这篇文章 中分别介绍了基本数据类型和STL的序列化,却没有讲关于这两者组合而成的结构的序列化。闲话少说,直接看代码吧:

/*
 *	[email protected]
 */

#include <iostream>
#include <fstream>
#include <vector>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/serialization/vector.hpp>

//////////////////////////////////////////////////////////////////////////
typedef struct _Data
{
	bool m_flag;
	std::vector<int> m_vec;

	_Data() : m_flag(false){}
}Data;

void save_data(char * filename)
{
	std::ofstream file(filename);
	boost::archive::xml_oarchive oa(file);
	Data d;
	d.m_flag = true;
	for (size_t i= 0; i < 100; ++i)
	{
		d.m_vec.push_back(i);
	}

	oa & BOOST_SERIALIZATION_NVP(d.m_flag);
	oa & BOOST_SERIALIZATION_NVP(d.m_vec);
} 

void load_data(char * filename)
{
	std::ifstream file(filename);
	boost::archive::xml_iarchive ia(file);
	Data dr;

	ia >> BOOST_SERIALIZATION_NVP(dr.m_flag);
	ia >> BOOST_SERIALIZATION_NVP(dr.m_vec); // No size/range needed
	std::cout<<"Data::m_flag : "<<dr.m_flag<<std::endl;
	std::cout<<"Data::m_vec : ";
	std::ostream_iterator<int> oi(std::cout, " ");
	std::copy(dr.m_vec.begin(), dr.m_vec.end(), oi);
}
//////////////////////////////////////////////////////////////////////////
namespace boost
{
	namespace serialization
	{
		template<class Archive>
		void serialize(Archive& archive, Data &d, const unsigned int version)
		{
			archive & BOOST_SERIALIZATION_NVP(d.m_flag);
			archive & BOOST_SERIALIZATION_NVP(d.m_vec);
		}
	}
}
//////////////////////////////////////////////////////////////////////////
int main(void)
{
	save_data("archive_Data.xml");
	load_data("archive_Data.xml");
	system("pause");
	return 0;
}

生成的archive_data.xml文件内容为:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="9">
<d.m_flag>1</d.m_flag>
<d.m_vec>
	<count>100</count>
	<item_version>0</item_version>
	<item>0</item>
	<item>1</item>
	<item>2</item>
	<item>3</item>
	<item>4</item>
	<item>5</item>
	<item>6</item>
	<item>7</item>
	<item>8</item>
	<item>9</item>
	<item>10</item>
	<item>11</item>
	<item>12</item>
	<item>13</item>
	<item>14</item>
	<item>15</item>
	<item>16</item>
	<item>17</item>
	<item>18</item>
	<item>19</item>
	<item>20</item>
	<item>21</item>
	<item>22</item>
	<item>23</item>
	<item>24</item>
	<item>25</item>
	<item>26</item>
	<item>27</item>
	<item>28</item>
	<item>29</item>
	<item>30</item>
	<item>31</item>
	<item>32</item>
	<item>33</item>
	<item>34</item>
	<item>35</item>
	<item>36</item>
	<item>37</item>
	<item>38</item>
	<item>39</item>
	<item>40</item>
	<item>41</item>
	<item>42</item>
	<item>43</item>
	<item>44</item>
	<item>45</item>
	<item>46</item>
	<item>47</item>
	<item>48</item>
	<item>49</item>
	<item>50</item>
	<item>51</item>
	<item>52</item>
	<item>53</item>
	<item>54</item>
	<item>55</item>
	<item>56</item>
	<item>57</item>
	<item>58</item>
	<item>59</item>
	<item>60</item>
	<item>61</item>
	<item>62</item>
	<item>63</item>
	<item>64</item>
	<item>65</item>
	<item>66</item>
	<item>67</item>
	<item>68</item>
	<item>69</item>
	<item>70</item>
	<item>71</item>
	<item>72</item>
	<item>73</item>
	<item>74</item>
	<item>75</item>
	<item>76</item>
	<item>77</item>
	<item>78</item>
	<item>79</item>
	<item>80</item>
	<item>81</item>
	<item>82</item>
	<item>83</item>
	<item>84</item>
	<item>85</item>
	<item>86</item>
	<item>87</item>
	<item>88</item>
	<item>89</item>
	<item>90</item>
	<item>91</item>
	<item>92</item>
	<item>93</item>
	<item>94</item>
	<item>95</item>
	<item>96</item>
	<item>97</item>
	<item>98</item>
	<item>99</item>
</d.m_vec>
</boost_serialization>

控制台上打印的数据为:

Data::m_flag : 1
Data::m_vec : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 6
5 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
 99 请按任意键继续. . .

可以看出数据反序列化成功!

参考资料:

http://blog.csdn.net/lanxuezaipiao/article/details/24845625

https://www.ibm.com/developerworks/cn/aix/library/au-boostserialization/

对象序列化之Boost.Serialization

时间: 2024-08-25 22:20:48

对象序列化之Boost.Serialization的相关文章

boost::serialization 用基类指针转存派生类(错误多多,一波三折)

boost::serialization 也支持c++的多态,这样我们就可以通过使用基类的指针来转存派生类, 我们接着上一篇( boost::serialization(2)序列化基类 )的例子来看: 基类和派生类的代码如下: class student_info { public: student_info() {} virtual ~student_info() {} student_info(const std::string& sn, const std::string& snm,

笔记:I/O流-对象序列化

Java 语言支持一种称为对象序列化(Object Serialization)的非常通用的机制,可以将任何对象写入到流中,并在之后将其读回,首先需要支持对象序列化的类,必须继承与 Serializable 接口,该接口没有任何方法,只是对类起到标记的作用,然后使用 ObjectOutputStream 流来序列化对象,使用 ObjectInputStream 流来反序列化,示例代码如下: 对象类声明: public class Employee implements Serializable

最常用的两种C++序列化方案的使用心得(protobuf和boost serialization)

导读 1. 什么是序列化? 2. 为什么要序列化?好处在哪里? 3. C++对象序列化的四种方法 4. 最常用的两种序列化方案使用心得 正文 1. 什么是序列化? 程序员在编写应用程序的时候往往需要将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的另一台计算机上以实现通讯.这个将 程序数据转化成能被存储并传输的格式的过程被称为"序列化"(Serialization),而它的逆过程则可被称为"反序列化" (Deserialization). 简单

最经常使用的两种C++序列化方案的使用心得(protobuf和boost serialization)

导读 1. 什么是序列化? 2. 为什么要序列化?优点在哪里? 3. C++对象序列化的四种方法 4. 最经常使用的两种序列化方案使用心得 正文 1. 什么是序列化? 程序猿在编写应用程序的时候往往须要将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的还有一台计算机上以实现通讯.这个将程序数据转化成能被存储并传输的格式的过程被称为"序列化"(Serialization),而它的逆过程则可被称为"反序列化"(Deserialization). 简

畅游C++ Boost Serialization 序列化

畅游C++ Boost Serialization 序列化 1.C++ Boost::serialization简介 2.工作环境 3.使用方法 3.1第一个简单的例子 -- Hello World ,将字符串内容归档到文本文件中 #include <iostream> #include <fstream> #include <string> #include <cstdio> #include <boost/archive/text_oarchive

boost::serialization(2)序列化基类

在派生类中序列化一个基类 假如有一个基类如下: class student_info { public: student_info() {} virtual ~student_info() {} student_info(const std::string& sn, const std::string& snm, const std::string& sg) : name_(sn), number_(snm), grade_(sg) { } virtual void print_i

怎样用boost::serialization去序列化派生模板类

本篇是boost::serialization 用基类指针转存派生类(错误多多,一波三折)的姊妹篇,这里只不过做一个总结. 先来看一个基类 class base_class { public: base_class(int m=0) : base_member_(0) {} virtual ~base_class() {} virtual void print_data() = 0; protected: int base_member_; //other member... }; 它的一个模板

如何用boost::serialization去序列化派生模板类(续)

在 如何用boost::serialization去序列化派生模板类这篇文章中,介绍了序列化派生类模板类, 在写測试用例时一直出现编译错误,调了非常久也没跳出来,今天偶然试了一下...竟然调了出来. 先看看变异错误的代码(...看不出有错,但是编译就有错). 基类代码: class base_class { public: base_class(int m=0) : base_member_(0) {} virtual ~base_class() {} virtual void print_da

怎样用boost::serialization去序列化派生模板类(续)

在 怎样用boost::serialization去序列化派生模板类这篇文章中,介绍了序列化派生类模板类, 在写测试用例时一直出现编译错误,调了很久也没跳出来,今天偶然试了一下...居然调了出来. 先看看变异错误的代码(...看不出有错,可是编译就有错). 基类代码: class base_class { public: base_class(int m=0) : base_member_(0) {} virtual ~base_class() {} virtual void print_dat