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