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