Blame view

3rdparty/boost_1_81_0/libs/serialization/doc/rationale.html 6.2 KB
73ef4ff3   Hu Chunming   提交三方库
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
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
  <!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  <html>
  <!--
  (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . 
  Use, modification and distribution is subject to the Boost Software
  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  http://www.boost.org/LICENSE_1_0.txt)
  -->
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <link rel="stylesheet" type="text/css" href="../../../boost.css">
  <link rel="stylesheet" type="text/css" href="style.css">
  <title>Seriealization - Rationale</title>
  </head>
  <body link="#0000ff" vlink="#800080">
  <table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
      "header">
    <tr> 
      <td valign="top" width="300"> 
        <h3><a href="http://www.boost.org"><img height="86" width="277" alt="C++ Boost" src="../../../boost.png" border="0"></a></h3>
      </td>
      <td valign="top"> 
        <h1 align="center">Serialization</h1>
        <h2 align="center">Rationale</h2>
      </td>
    </tr>
  </table>
  <hr>
  <dl class="index">
    <dt><a href="#serialization">The term "serialization" is preferred to "persistence"</a></dt>
    <dt><a href="#archives">Archives are not streams</a></dt>
    <dt><a href="#strings">Strings are treated specially in text archives</a></dt>
    <dt><a href="#typeid"><code style="white-space: normal">typeid</code> information is not included in archives</a></dt>
    <!--
    <dt><a href="#footnotes">Footnotes</a></dt>
    -->
  </dl>
  <h2><a name="serialization"></a>The term "serialization" is preferred to "persistence"</h2>
  <p>
  I found that persistence is often used to refer
  to something quite different. Examples are storage of class
  instances (objects) in database schema <a href="bibliography.html#4">[4]</a>
  This library will be useful in other contexts besides implementing persistence. The
  most obvious case is that of marshalling data for transmission to another system.
  <h2><a name="archives"></a>Archives are not streams</h2>
  <p>
  Archive classes are <strong>NOT</strong> derived from
  streams even though they have similar syntax rules.
  <ul>
      <li>Archive classes are not kinds of streams though they
      are implemented in terms of streams. This
      distinction is addressed in <a href="bibliography.html#5">[5]</a> item number 41.
      <li>We don't want users to insert/extract&nbsp;data
      directly into/from &nbsp;the stream .&nbsp; This could
      create a corrupted archive. Were archives
      derived from streams, it would possible to
      accidentally do this. So archive classes
      only define operations which are safe and necessary.
      <li>The usage of streams to implement the archive classes that
      are included in the library is merely convenient - not necessary.
      Library users may well want to define their own archive format
      which doesn't use streams at all.
  </ul>
  <h2><a name="primitives"></a>Archive Members are Templates 
  Rather than Virtual Functions</h2>
  The previous version of this library defined virtual functions for all
  primitive types.  These were overridden by each archive class.  There were
  two issues related to this:
  </ul>
      <li>Some disliked virtual functions because of the added execution time
      overhead.
      <li>This caused implementation difficulties since the set of primitive
      data types varies between platforms.  Attempting to define the correct
      set of virtual functions, (think <code style="white-space: normal">long long</code>, 
      <code style="white-space: normal">__int64</code>, 
      etc.) resulted in messy and fragile code.  Replacing this with templates
      and letting the compiler generate the code for the primitive types actually
      used, resolved this problem.  Of course, the ripple effects of this design
      change were significant, but in the end led to smaller, faster, more
      maintainable code.
  </ul>
  <h2><a name="strings"></a><code style="white-space: normal">std::strings</code> are treated specially in text files</h2>
  <p>
  Treating strings as STL vectors would result in minimal code size. This was
  not done because:
  <ul>
       <li>In text archives it is convenient to be able to view strings.  Our text
       implementation stores single characters as integers.  Storing strings
       as a vector of characters would waste space and render the archives
       inconvenient for debugging.
       <li>Stream implementations have special functions for <code style="white-space: normal">std::string</code>
       and <code style="white-space: normal">std::wstring</code>.
       Presumably they optimize appropriately.
       <li>Other specializations of <code style="white-space: normal">std::basic_string</code> are in fact handled
       as vectors of the element type.
  </ul>
  </p>
  <h2><a name="typeid"></a><code style="white-space: normal">typeid</code> information is not included in archives</h2>
  <p>
  I originally thought that I had to save the name of the class specified by <code style="white-space: normal">std::type_of::name()</code>
  in the archive. This created difficulties as <code style="white-space: normal">std::type_of::name()</code> is not portable and
  not guaranteed to return the class name. This makes it almost useless for implementing
  archive portability.  This topic is explained in much more detail in
  <a href="bibliography.html#6">[7] page 206</a>. It turned out that it was not necessary.
  As long as objects are loaded in the exact sequence as they were saved, the type
  is available when loading.  The only exception to this is the case of polymorphic
  pointers never before loaded/saved.  This is addressed with the <code style="white-space: normal">register_type()</code>
  and/or <code style="white-space: normal">export</code> facilities described in the reference.  
  In effect, <code style="white-space: normal">export</code> generates a portable equivalent to
  <code style="white-space: normal">typeid</code> information.
  
  <!--
  <h2><a name="footnotes"></a>Footnotes</h2>
  <dl>
    <dt><a name="footnote1" class="footnote">(1)</a> {{text}}</dt>
    <dt><a name="footnote2" class="footnote">(2)</a> {{text}}</dt>
  </dl>
  -->
  <hr>
  <p><i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2002-2004. 
  Distributed under the Boost Software License, Version 1.0. (See
  accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  </i></p>
  </body>
  </html>