首页 > 代码库 > 对象序列化之Boost.Serialization

对象序列化之Boost.Serialization

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

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

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

/*
 *	lming_08@hotmail.com
 */

#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/