gtsam  4.0.0
gtsam
serialization.h
1 /* ----------------------------------------------------------------------------
2 
3  * GTSAM Copyright 2010, Georgia Tech Research Corporation,
4  * Atlanta, Georgia 30332-0415
5  * All Rights Reserved
6  * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
7 
8  * See LICENSE for the license information
9 
10  * -------------------------------------------------------------------------- */
11 
20 #pragma once
21 
22 #include <sstream>
23 #include <fstream>
24 #include <string>
25 
26 // includes for standard serialization types
27 #include <boost/serialization/optional.hpp>
28 #include <boost/serialization/shared_ptr.hpp>
29 #include <boost/serialization/vector.hpp>
30 #include <boost/serialization/map.hpp>
31 #include <boost/serialization/list.hpp>
32 #include <boost/serialization/deque.hpp>
33 #include <boost/serialization/weak_ptr.hpp>
34 
35 #include <boost/archive/text_oarchive.hpp>
36 #include <boost/archive/text_iarchive.hpp>
37 #include <boost/archive/xml_iarchive.hpp>
38 #include <boost/archive/xml_oarchive.hpp>
39 #include <boost/archive/binary_iarchive.hpp>
40 #include <boost/archive/binary_oarchive.hpp>
41 #include <boost/serialization/export.hpp>
42 
43 namespace gtsam {
44 
45 // Serialization directly to strings in compressed format
46 template<class T>
47 std::string serialize(const T& input) {
48  std::ostringstream out_archive_stream;
49  boost::archive::text_oarchive out_archive(out_archive_stream);
50  out_archive << input;
51  return out_archive_stream.str();
52 }
53 
54 template<class T>
55 void deserialize(const std::string& serialized, T& output) {
56  std::istringstream in_archive_stream(serialized);
57  boost::archive::text_iarchive in_archive(in_archive_stream);
58  in_archive >> output;
59 }
60 
61 template<class T>
62 bool serializeToFile(const T& input, const std::string& filename) {
63  std::ofstream out_archive_stream(filename.c_str());
64  if (!out_archive_stream.is_open())
65  return false;
66  boost::archive::text_oarchive out_archive(out_archive_stream);
67  out_archive << input;
68  out_archive_stream.close();
69  return true;
70 }
71 
72 template<class T>
73 bool deserializeFromFile(const std::string& filename, T& output) {
74  std::ifstream in_archive_stream(filename.c_str());
75  if (!in_archive_stream.is_open())
76  return false;
77  boost::archive::text_iarchive in_archive(in_archive_stream);
78  in_archive >> output;
79  in_archive_stream.close();
80  return true;
81 }
82 
83 // Serialization to XML format with named structures
84 template<class T>
85 std::string serializeXML(const T& input, const std::string& name="data") {
86  std::ostringstream out_archive_stream;
87  // braces to flush out_archive as it goes out of scope before taking str()
88  // fixes crash with boost 1.66-1.68
89  // see https://github.com/boostorg/serialization/issues/82
90  {
91  boost::archive::xml_oarchive out_archive(out_archive_stream);
92  out_archive << boost::serialization::make_nvp(name.c_str(), input);
93  }
94  return out_archive_stream.str();
95 }
96 
97 template<class T>
98 void deserializeXML(const std::string& serialized, T& output, const std::string& name="data") {
99  std::istringstream in_archive_stream(serialized);
100  boost::archive::xml_iarchive in_archive(in_archive_stream);
101  in_archive >> boost::serialization::make_nvp(name.c_str(), output);
102 }
103 
104 template<class T>
105 bool serializeToXMLFile(const T& input, const std::string& filename, const std::string& name="data") {
106  std::ofstream out_archive_stream(filename.c_str());
107  if (!out_archive_stream.is_open())
108  return false;
109  boost::archive::xml_oarchive out_archive(out_archive_stream);
110  out_archive << boost::serialization::make_nvp(name.c_str(), input);;
111  out_archive_stream.close();
112  return true;
113 }
114 
115 template<class T>
116 bool deserializeFromXMLFile(const std::string& filename, T& output, const std::string& name="data") {
117  std::ifstream in_archive_stream(filename.c_str());
118  if (!in_archive_stream.is_open())
119  return false;
120  boost::archive::xml_iarchive in_archive(in_archive_stream);
121  in_archive >> boost::serialization::make_nvp(name.c_str(), output);
122  in_archive_stream.close();
123  return true;
124 }
125 
126 // Serialization to binary format with named structures
127 template<class T>
128 std::string serializeBinary(const T& input, const std::string& name="data") {
129  std::ostringstream out_archive_stream;
130  boost::archive::binary_oarchive out_archive(out_archive_stream);
131  out_archive << boost::serialization::make_nvp(name.c_str(), input);
132  return out_archive_stream.str();
133 }
134 
135 template<class T>
136 void deserializeBinary(const std::string& serialized, T& output, const std::string& name="data") {
137  std::istringstream in_archive_stream(serialized);
138  boost::archive::binary_iarchive in_archive(in_archive_stream);
139  in_archive >> boost::serialization::make_nvp(name.c_str(), output);
140 }
141 
142 template<class T>
143 bool serializeToBinaryFile(const T& input, const std::string& filename, const std::string& name="data") {
144  std::ofstream out_archive_stream(filename.c_str());
145  if (!out_archive_stream.is_open())
146  return false;
147  boost::archive::binary_oarchive out_archive(out_archive_stream);
148  out_archive << boost::serialization::make_nvp(name.c_str(), input);
149  out_archive_stream.close();
150  return true;
151 }
152 
153 template<class T>
154 bool deserializeFromBinaryFile(const std::string& filename, T& output, const std::string& name="data") {
155  std::ifstream in_archive_stream(filename.c_str());
156  if (!in_archive_stream.is_open())
157  return false;
158  boost::archive::binary_iarchive in_archive(in_archive_stream);
159  in_archive >> boost::serialization::make_nvp(name.c_str(), output);
160  in_archive_stream.close();
161  return true;
162 }
163 
164 } // \namespace gtsam
Global functions in a separate testing namespace.
Definition: chartTesting.h:28