<p>This code is a start to the use of <code>boost::serialization</code> instead of the current <code>SaveRestoreUtility</code> mess.  If your mlpack class implements a <code>Serialize()</code> function, then you can use <code>boost::serialization</code> to save it:</p>

<pre><code>MyClass myclass(...);
boost::archive::xml_oarchive oarch("my_file.xml"); // or binary_oarchive or text_oarchive
oarch &lt;&lt; data::CreateNVP(myclass, "myclass"); // create a name-value pair for saving
</code></pre>

<p>and to load it:</p>

<pre><code>MyClass myclass(...);
boost::archive::xml_iarchive iarch("my_file.xml"); // or binary_iarchive or text_iarchive
iarch &gt;&gt; data::CreateNVP(myclass, "myclass"); // use the same name-value pair as before
</code></pre>

<p>This involved writing a confusing, complex shim object so we could write <code>Serialize()</code> in accordance with the mlpack method naming guidelines instead of <code>serialize()</code>, for the sake of consistency.  Certainly there is more documentation to be done before a release; specifically, classes that use references are probably going to need some amount of refactoring (see what I had to do to <code>BinarySpaceTree</code>, for instance).</p>

<p>I've opened a PR instead of just merging it in, in order to give an opportunity to say "no, don't do it!".  I'll probably leave this open for a week or two before merging.</p>

<hr>

<h4>You can view, comment on, or merge this pull request online at:</h4>
<p>&nbsp;&nbsp;<a href='https://github.com/mlpack/mlpack/pull/443'>https://github.com/mlpack/mlpack/pull/443</a></p>

<h4>Commit Summary</h4>
<ul>
  <li>Add wrapper for boost::serialization.</li>
  <li>Add list of formats we can load.</li>
  <li>Update CMakeLists.txt.</li>
  <li>Convenience function for extracting extensions.</li>
  <li>Add Load() and Save() for models.</li>
  <li>Move serialization shim to data/.</li>
  <li>Fix syntax and include errors.</li>
  <li>Add boost::serialization to dependencies.</li>
  <li>A few first tests for serialization.</li>
  <li>Add serialization for arma::mat.</li>
  <li>Add serialization for sparse matrices.</li>
  <li>Refactor includes to include serialization code.</li>
  <li>Add Serialize() to distributions.</li>
  <li>Add tests for distribution Serialize().</li>
  <li>Add Serialize() to kernels; not yet tested.</li>
  <li>Add Range::Serialize().</li>
  <li>Refactor and add Serialize().</li>
  <li>Add Serialize() to MahalanobisDistance.</li>
  <li>Clarify comments, fix accessors.</li>
  <li>Add BallBound&lt;&gt;::Serialize().</li>
  <li>Some serialization changes.</li>
  <li>Allow serialization of linear regression.</li>
  <li>Add shims for arrays.</li>
  <li>Fix typo.</li>
  <li>Comment out unused member.</li>
  <li>Fix memory misuse.</li>
  <li>Add shims for pointers.</li>
  <li>Update comment for serialize() interception.</li>
  <li>Add Serialize() for empty class.</li>
  <li>Be safer with memory usage.</li>
  <li>Add Serialize() for HRectBound&lt;&gt;.</li>
  <li>Add some more tests.</li>
  <li>A first pass at refactoring BinarySpaceTree.</li>
  <li>Refactor tree test.</li>
  <li>Merge branch &#39;master&#39; into serialize</li>
  <li>Refactor NeighborSearch internals to deal with the tree holding the dataset internally.</li>
  <li>Refactor tests to deal with modified NeighborSearch.</li>
  <li>Merge branch &#39;master&#39; into serialize</li>
  <li>Add serialization for statistic.</li>
  <li>Fix memory leak when overwriting bounds.</li>
  <li>Add BinarySpaceTree::Serialize() and tests.</li>
  <li>Fix some style.</li>
  <li>Remove unnecessary LastDistanceNode().</li>
  <li>Add Serialize(); remove unnecessary LastDistanceNode().</li>
</ul>

<h4>File Changes</h4>
<ul>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-0">CMakeLists.txt</a>
    (1)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-1">src/mlpack/core/arma_extend/Mat_extra_bones.hpp</a>
    (4)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-2">src/mlpack/core/arma_extend/Mat_extra_meat.hpp</a>
    (32)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-3">src/mlpack/core/arma_extend/SpMat_extra_bones.hpp</a>
    (6)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-4">src/mlpack/core/arma_extend/SpMat_extra_meat.hpp</a>
    (34)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-5">src/mlpack/core/arma_extend/arma_extend.hpp</a>
    (5)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-6">src/mlpack/core/data/CMakeLists.txt</a>
    (3)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-7">src/mlpack/core/data/extension.hpp</a>
    (33)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-8">src/mlpack/core/data/format.hpp</a>
    (26)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-9">src/mlpack/core/data/load.hpp</a>
    (42)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-10">src/mlpack/core/data/load_impl.hpp</a>
    (109)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-11">src/mlpack/core/data/save.hpp</a>
    (40)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-12">src/mlpack/core/data/save_impl.hpp</a>
    (95)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-13">src/mlpack/core/data/serialization_shim.hpp</a>
    (575)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-14">src/mlpack/core/dists/discrete_distribution.hpp</a>
    (11)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-15">src/mlpack/core/dists/gaussian_distribution.cpp</a>
    (3)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-16">src/mlpack/core/dists/gaussian_distribution.hpp</a>
    (16)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-17">src/mlpack/core/dists/laplace_distribution.hpp</a>
    (10)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-18">src/mlpack/core/dists/regression_distribution.hpp</a>
    (23)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-19">src/mlpack/core/kernels/cosine_distance.hpp</a>
    (4)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-20">src/mlpack/core/kernels/epanechnikov_kernel.hpp</a>
    (6)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-21">src/mlpack/core/kernels/epanechnikov_kernel_impl.hpp</a>
    (9)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-22">src/mlpack/core/kernels/example_kernel.hpp</a>
    (7)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-23">src/mlpack/core/kernels/gaussian_kernel.hpp</a>
    (8)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-24">src/mlpack/core/kernels/hyperbolic_tangent_kernel.hpp</a>
    (8)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-25">src/mlpack/core/kernels/laplacian_kernel.hpp</a>
    (7)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-26">src/mlpack/core/kernels/linear_kernel.hpp</a>
    (4)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-27">src/mlpack/core/kernels/polynomial_kernel.hpp</a>
    (8)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-28">src/mlpack/core/kernels/spherical_kernel.hpp</a>
    (8)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-29">src/mlpack/core/kernels/triangular_kernel.hpp</a>
    (7)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-30">src/mlpack/core/math/range.hpp</a>
    (6)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-31">src/mlpack/core/math/range_impl.hpp</a>
    (8)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-32">src/mlpack/core/metrics/ip_metric.hpp</a>
    (16)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-33">src/mlpack/core/metrics/ip_metric_impl.hpp</a>
    (33)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-34">src/mlpack/core/metrics/lmetric.hpp</a>
    (4)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-35">src/mlpack/core/metrics/mahalanobis_distance.hpp</a>
    (4)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-36">src/mlpack/core/metrics/mahalanobis_distance_impl.hpp</a>
    (9)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-37">src/mlpack/core/tree/ballbound.hpp</a>
    (19)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-38">src/mlpack/core/tree/ballbound_impl.hpp</a>
    (21)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-39">src/mlpack/core/tree/binary_space_tree/binary_space_tree.hpp</a>
    (117)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-40">src/mlpack/core/tree/binary_space_tree/binary_space_tree_impl.hpp</a>
    (229)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-41">src/mlpack/core/tree/hrectbound.hpp</a>
    (6)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-42">src/mlpack/core/tree/hrectbound_impl.hpp</a>
    (20)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-43">src/mlpack/core/tree/statistic.hpp</a>
    (8)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-44">src/mlpack/core/util/sfinae_utility.hpp</a>
    (1)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-45">src/mlpack/methods/linear_regression/linear_regression.hpp</a>
    (22)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-46">src/mlpack/methods/neighbor_search/neighbor_search.hpp</a>
    (11)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-47">src/mlpack/methods/neighbor_search/neighbor_search_impl.hpp</a>
    (56)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-48">src/mlpack/methods/neighbor_search/neighbor_search_stat.hpp</a>
    (18)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-49">src/mlpack/methods/range_search/range_search_stat.hpp</a>
    (9)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-50">src/mlpack/prereqs.hpp</a>
    (5)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-51">src/mlpack/tests/CMakeLists.txt</a>
    (1)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-52">src/mlpack/tests/allkfn_test.cpp</a>
    (7)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-53">src/mlpack/tests/allknn_test.cpp</a>
    (7)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-54">src/mlpack/tests/load_save_test.cpp</a>
    (106)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-55">src/mlpack/tests/range_search_test.cpp</a>
    (1)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-56">src/mlpack/tests/serialization_test.cpp</a>
    (688)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/mlpack/mlpack/pull/443/files#diff-57">src/mlpack/tests/tree_test.cpp</a>
    (84)
  </li>
</ul>

<h4>Patch Links:</h4>
<ul>
  <li><a href='https://github.com/mlpack/mlpack/pull/443.patch'>https://github.com/mlpack/mlpack/pull/443.patch</a></li>
  <li><a href='https://github.com/mlpack/mlpack/pull/443.diff'>https://github.com/mlpack/mlpack/pull/443.diff</a></li>
</ul>

<p style="font-size:small;-webkit-text-size-adjust:none;color:#666;">&mdash;<br>Reply to this email directly or <a href="https://github.com/mlpack/mlpack/pull/443">view it on GitHub</a>.<img alt="" height="1" src="https://github.com/notifications/beacon/AJ4bFMgt_J5uGBfNbFYSMMX-qVP2AP4pks5oWukbgaJpZM4FLEcg.gif" width="1" /></p>
<div itemscope itemtype="http://schema.org/EmailMessage">
  <div itemprop="action" itemscope itemtype="http://schema.org/ViewAction">
    <link itemprop="url" href="https://github.com/mlpack/mlpack/pull/443"></link>
    <meta itemprop="name" content="View Pull Request"></meta>
  </div>
  <meta itemprop="description" content="View this Pull Request on GitHub"></meta>
</div>