#pragma once namespace cereal { class BinaryOutputArchive : public OutputArchive { public: BinaryOutputArchive(std::ostream & stream) : OutputArchive(this), itsStream(stream) { } //! Writes size bytes of data to the output stream void save_binary( const void * data, size_t size ) { auto const writtenSize = itsStream.rdbuf()->sputn( reinterpret_cast( data ), size ); if(writtenSize != size) throw 1; // TODO: something terrible } private: std::ostream & itsStream; }; //! Serialization for POD types to binary template typename std::enable_if::value, void>::type save(BinaryOutputArchive & ar, T const & t) { ar.save_binary(std::addressof(t), sizeof(t)); std::cout << "Serializing POD size: " << sizeof(T) << " [" << t << "]" << std::endl; } //! Serialization for NVP types to binary template typename std::enable_if::value, void>::type save(BinaryOutputArchive & ar, T const & t) { std::cout << "Serializing NVP: " << t.name << " " << t.value << std::endl; ar & t.value; } //! Serialization for basic_string types to binary template void save(BinaryOutputArchive & ar, std::basic_string const & str) { // Save number of chars + the data ar & str.size(); ar.save_binary(str.data(), str.size() * sizeof(CharT)); std::cout << "Saving string: " << str << std::endl; } //! Serialization for basic_string types to binary template void load(BinaryOutputArchive & ar, std::basic_string & str) { std::cout << "Loading string: " << str << std::endl; } }