Separate stream creation and serialization
Recommended by @ProfFan in #343 with the objective of making (de)serialize to string and to file more similarrelease/4.3a0
							parent
							
								
									a796f74b80
								
							
						
					
					
						commit
						327cbc515f
					
				| 
						 | 
					@ -44,18 +44,28 @@ namespace gtsam {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Serialization directly to strings in compressed format
 | 
					// Serialization directly to strings in compressed format
 | 
				
			||||||
template<class T>
 | 
					template<class T>
 | 
				
			||||||
std::string serialize(const T& input) {
 | 
					void serialize(const T& input, std::ostream & out_archive_stream) {
 | 
				
			||||||
  std::ostringstream out_archive_stream;
 | 
					 | 
				
			||||||
  boost::archive::text_oarchive out_archive(out_archive_stream);
 | 
					  boost::archive::text_oarchive out_archive(out_archive_stream);
 | 
				
			||||||
  out_archive << input;
 | 
					  out_archive << input;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<class T>
 | 
				
			||||||
 | 
					void deserialize(std::istream & in_archive_stream, T& output) {
 | 
				
			||||||
 | 
					  boost::archive::text_iarchive in_archive(in_archive_stream);
 | 
				
			||||||
 | 
					  in_archive >> output;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<class T>
 | 
				
			||||||
 | 
					std::string serialize(const T& input) {
 | 
				
			||||||
 | 
					  std::ostringstream out_archive_stream;
 | 
				
			||||||
 | 
					  serialize(input, out_archive_stream);
 | 
				
			||||||
  return out_archive_stream.str();
 | 
					  return out_archive_stream.str();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<class T>
 | 
					template<class T>
 | 
				
			||||||
void deserialize(const std::string& serialized, T& output) {
 | 
					void deserialize(const std::string& serialized, T& output) {
 | 
				
			||||||
  std::istringstream in_archive_stream(serialized);
 | 
					  std::istringstream in_archive_stream(serialized);
 | 
				
			||||||
  boost::archive::text_iarchive in_archive(in_archive_stream);
 | 
					  deserialize(in_archive_stream, output);
 | 
				
			||||||
  in_archive >> output;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<class T>
 | 
					template<class T>
 | 
				
			||||||
| 
						 | 
					@ -63,8 +73,7 @@ bool serializeToFile(const T& input, const std::string& filename) {
 | 
				
			||||||
  std::ofstream out_archive_stream(filename.c_str());
 | 
					  std::ofstream out_archive_stream(filename.c_str());
 | 
				
			||||||
  if (!out_archive_stream.is_open())
 | 
					  if (!out_archive_stream.is_open())
 | 
				
			||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
  boost::archive::text_oarchive out_archive(out_archive_stream);
 | 
					  serialize(input, out_archive_stream);
 | 
				
			||||||
  out_archive << input;
 | 
					 | 
				
			||||||
  out_archive_stream.close();
 | 
					  out_archive_stream.close();
 | 
				
			||||||
  return true;
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -74,31 +83,37 @@ bool deserializeFromFile(const std::string& filename, T& output) {
 | 
				
			||||||
  std::ifstream in_archive_stream(filename.c_str());
 | 
					  std::ifstream in_archive_stream(filename.c_str());
 | 
				
			||||||
  if (!in_archive_stream.is_open())
 | 
					  if (!in_archive_stream.is_open())
 | 
				
			||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
  boost::archive::text_iarchive in_archive(in_archive_stream);
 | 
					  deserialize(in_archive_stream, output);
 | 
				
			||||||
  in_archive >> output;
 | 
					 | 
				
			||||||
  in_archive_stream.close();
 | 
					  in_archive_stream.close();
 | 
				
			||||||
  return true;
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Serialization to XML format with named structures
 | 
					// Serialization to XML format with named structures
 | 
				
			||||||
 | 
					template <class T>
 | 
				
			||||||
 | 
					void serializeXML(const T& input, std::ostream& out_archive_stream,
 | 
				
			||||||
 | 
					                  const std::string& name = "data") {
 | 
				
			||||||
 | 
					  boost::archive::xml_oarchive out_archive(out_archive_stream);
 | 
				
			||||||
 | 
					  out_archive << boost::serialization::make_nvp(name.c_str(), input);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template <class T>
 | 
				
			||||||
 | 
					void deserializeXML(std::istream& in_archive_stream, T& output,
 | 
				
			||||||
 | 
					                    const std::string& name = "data") {
 | 
				
			||||||
 | 
					  boost::archive::xml_iarchive in_archive(in_archive_stream);
 | 
				
			||||||
 | 
					  in_archive >> boost::serialization::make_nvp(name.c_str(), output);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<class T>
 | 
					template<class T>
 | 
				
			||||||
std::string serializeXML(const T& input, const std::string& name="data") {
 | 
					std::string serializeXML(const T& input, const std::string& name="data") {
 | 
				
			||||||
  std::ostringstream out_archive_stream;
 | 
					  std::ostringstream out_archive_stream;
 | 
				
			||||||
  // braces to flush out_archive as it goes out of scope before taking str()
 | 
					  serializeXML(input, out_archive_stream, name);
 | 
				
			||||||
  // fixes crash with boost 1.66-1.68
 | 
					 | 
				
			||||||
  // see https://github.com/boostorg/serialization/issues/82
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    boost::archive::xml_oarchive out_archive(out_archive_stream);
 | 
					 | 
				
			||||||
    out_archive << boost::serialization::make_nvp(name.c_str(), input);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  return out_archive_stream.str();
 | 
					  return out_archive_stream.str();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<class T>
 | 
					template<class T>
 | 
				
			||||||
void deserializeXML(const std::string& serialized, T& output, const std::string& name="data") {
 | 
					void deserializeXML(const std::string& serialized, T& output, const std::string& name="data") {
 | 
				
			||||||
  std::istringstream in_archive_stream(serialized);
 | 
					  std::istringstream in_archive_stream(serialized);
 | 
				
			||||||
  boost::archive::xml_iarchive in_archive(in_archive_stream);
 | 
					  deserializeXML(in_archive_stream, output, name);
 | 
				
			||||||
  in_archive >> boost::serialization::make_nvp(name.c_str(), output);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<class T>
 | 
					template<class T>
 | 
				
			||||||
| 
						 | 
					@ -106,10 +121,7 @@ bool serializeToXMLFile(const T& input, const std::string& filename, const std::
 | 
				
			||||||
  std::ofstream out_archive_stream(filename.c_str());
 | 
					  std::ofstream out_archive_stream(filename.c_str());
 | 
				
			||||||
  if (!out_archive_stream.is_open())
 | 
					  if (!out_archive_stream.is_open())
 | 
				
			||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
  {
 | 
					  serializeXML(input, out_archive_stream, name);
 | 
				
			||||||
    boost::archive::xml_oarchive out_archive(out_archive_stream);
 | 
					 | 
				
			||||||
    out_archive << boost::serialization::make_nvp(name.c_str(), input);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  out_archive_stream.close();
 | 
					  out_archive_stream.close();
 | 
				
			||||||
  return true;
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -119,28 +131,38 @@ bool deserializeFromXMLFile(const std::string& filename, T& output, const std::s
 | 
				
			||||||
  std::ifstream in_archive_stream(filename.c_str());
 | 
					  std::ifstream in_archive_stream(filename.c_str());
 | 
				
			||||||
  if (!in_archive_stream.is_open())
 | 
					  if (!in_archive_stream.is_open())
 | 
				
			||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
  {
 | 
					  deserializeXML(in_archive_stream, output, name);
 | 
				
			||||||
    boost::archive::xml_iarchive in_archive(in_archive_stream);
 | 
					 | 
				
			||||||
    in_archive >> boost::serialization::make_nvp(name.c_str(), output);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  in_archive_stream.close();
 | 
					  in_archive_stream.close();
 | 
				
			||||||
  return true;
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Serialization to binary format with named structures
 | 
				
			||||||
 | 
					template <class T>
 | 
				
			||||||
 | 
					void serializeBinary(const T& input, std::ostream& out_archive_stream,
 | 
				
			||||||
 | 
					                            const std::string& name = "data") {
 | 
				
			||||||
 | 
					  boost::archive::binary_oarchive out_archive(out_archive_stream);
 | 
				
			||||||
 | 
					  out_archive << boost::serialization::make_nvp(name.c_str(), input);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template <class T>
 | 
				
			||||||
 | 
					void deserializeBinary(std::istream& in_archive_stream, T& output,
 | 
				
			||||||
 | 
					                       const std::string& name = "data") {
 | 
				
			||||||
 | 
					  boost::archive::binary_iarchive in_archive(in_archive_stream);
 | 
				
			||||||
 | 
					  in_archive >> boost::serialization::make_nvp(name.c_str(), output);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Serialization to binary format with named structures
 | 
					// Serialization to binary format with named structures
 | 
				
			||||||
template<class T>
 | 
					template<class T>
 | 
				
			||||||
std::string serializeBinary(const T& input, const std::string& name="data") {
 | 
					std::string serializeBinary(const T& input, const std::string& name="data") {
 | 
				
			||||||
  std::ostringstream out_archive_stream;
 | 
					  std::ostringstream out_archive_stream;
 | 
				
			||||||
  boost::archive::binary_oarchive out_archive(out_archive_stream);
 | 
					  serializeBinary(input, out_archive_stream, name);
 | 
				
			||||||
  out_archive << boost::serialization::make_nvp(name.c_str(), input);
 | 
					 | 
				
			||||||
  return out_archive_stream.str();
 | 
					  return out_archive_stream.str();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<class T>
 | 
					template<class T>
 | 
				
			||||||
void deserializeBinary(const std::string& serialized, T& output, const std::string& name="data") {
 | 
					void deserializeBinary(const std::string& serialized, T& output, const std::string& name="data") {
 | 
				
			||||||
  std::istringstream in_archive_stream(serialized);
 | 
					  std::istringstream in_archive_stream(serialized);
 | 
				
			||||||
  boost::archive::binary_iarchive in_archive(in_archive_stream);
 | 
					  deserializeBinary(in_archive_stream, output, name);
 | 
				
			||||||
  in_archive >> boost::serialization::make_nvp(name.c_str(), output);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<class T>
 | 
					template<class T>
 | 
				
			||||||
| 
						 | 
					@ -148,8 +170,7 @@ bool serializeToBinaryFile(const T& input, const std::string& filename, const st
 | 
				
			||||||
  std::ofstream out_archive_stream(filename.c_str());
 | 
					  std::ofstream out_archive_stream(filename.c_str());
 | 
				
			||||||
  if (!out_archive_stream.is_open())
 | 
					  if (!out_archive_stream.is_open())
 | 
				
			||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
  boost::archive::binary_oarchive out_archive(out_archive_stream);
 | 
					  serializeBinary(input, out_archive_stream, name);
 | 
				
			||||||
  out_archive << boost::serialization::make_nvp(name.c_str(), input);
 | 
					 | 
				
			||||||
  out_archive_stream.close();
 | 
					  out_archive_stream.close();
 | 
				
			||||||
  return true;
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -159,8 +180,7 @@ bool deserializeFromBinaryFile(const std::string& filename, T& output, const std
 | 
				
			||||||
  std::ifstream in_archive_stream(filename.c_str());
 | 
					  std::ifstream in_archive_stream(filename.c_str());
 | 
				
			||||||
  if (!in_archive_stream.is_open())
 | 
					  if (!in_archive_stream.is_open())
 | 
				
			||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
  boost::archive::binary_iarchive in_archive(in_archive_stream);
 | 
					  deserializeBinary(in_archive_stream, output, name);
 | 
				
			||||||
  in_archive >> boost::serialization::make_nvp(name.c_str(), output);
 | 
					 | 
				
			||||||
  in_archive_stream.close();
 | 
					  in_archive_stream.close();
 | 
				
			||||||
  return true;
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue