对象序列化之Boost.Serialization

来源:互联网 发布:windows 自动点击 编程 编辑:程序博客网 时间:2024/05/21 22:37

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

于是就想到了对象序列化,而对象序列化有好几种方案,常用的有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 neededstd::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 : 1Data::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 3132 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 65 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/


1 0
原创粉丝点击