책읽는잉여의 구글블로그
2014년 7월 23일 수요일
boost::serialization
boost::serialization 을 이용한 간단한 직렬화 역직렬화 코드이다.
#pragma warning ( push ) #pragma warning ( disable:4244 ) #include <boost/archive/binary_oarchive.hpp> #include <boost/archive/binary_iarchive.hpp> #include <boost/serialization/array.hpp> #include <boost/serialization/vector.hpp> #include <boost/serialization/list.hpp> #include <boost/serialization/string.hpp> #include <boost/iostreams/stream.hpp> #include <boost/iostreams/device/array.hpp> #include <boost/iostreams/device/back_inserter.hpp> #include <string> #include <vector> typedef std::vector<char> STREAM_BUFFER_TYPE; typedef boost::iostreams::back_insert_device<stream_buffer_type > BOOST_STREAM_DEVICE; typedef boost::iostreams::basic_array_source<char> BOOST_ARRAY_DEVICE; typedef boost::iostreams::stream<boost_stream_device> OUT_STREAM_TYPE; typedef boost::iostreams::stream_buffer<boost_array_device> IN_STREAM_TYPE; template <typename T> inline void Serialize(T const& obj/* _in_ */, STREAM_BUFFER_TYPE& buffer_/* _out_ */) { OUT_STREAM_TYPE out_s_(buffer_); boost::archive::binary_oarchive out_ar_(out_s_); out_ar_ << obj; out_s_.flush(); } template <typename T> inline bool Deserialize(T& obj/* _out_ */, char const* pRawData/* _in_ */, size_t dataSize/* _in_ */) { try { IN_STREAM_TYPE in_s_(pRawData, dataSize); boost::archive::binary_iarchive in_ar_(in_s_); in_ar_ >> obj; } catch (boost::archive::archive_exception const&) { return false; } return true; } template <typename AR> class serialize_helper { AR & ar_; public: explicit serialize_helper(AR & ar) : ar_(ar) {} template <typename T> void serialize_data(T& data) { ar_ & data; } template <typename T, typename ... args> void serialize_data(T& first, args&... rest) { ar_ & first; serialize_data(rest...); } }; template <typename AR, typename ... ARGS> inline void SerializeMember(AR & ar, ARGS & ... rest) { serialize_helper<ar>(ar).serialize_data(rest...); } #pragma warning ( pop ) struct sample_data { int id; std::string name; private: friend class boost::serialization::access; template <typename AR> void serialize(AR & ar, const unsigned int ver) { SerializeMember(ar, id, name); } }; int main() { sample_data src, dst; STREAM_BUFFER_TYPE buffer; src.id = 1001; src.name = "Hohoho"; Serialize(src, buffer); Deserialize(dst, &buffer.front(), buffer.size()); }
vs2013 에서 variadic 을 지원하기 시작하면서 기존에 만들어봤던 코드를 조금 간략하게 표현할 수 있게 되었다.
기존 :
/* serialization help function 그냥 노가다로 미리 마련해줌 */ template <typename AR, typename T> inline void SerializeMember(AR& ar, T& d1) { ar & d1; } template <typename AR, typename T, typename T2> inline void SerializeMember(AR& ar, T& d1, T2& d2) { ar & d1; ar & d2; } template <typename AR, typename T, typename T2, typename T3> inline void SerializeMember(AR& ar, T& d1, T2& d2, T3& d3) { ar & d1; ar & d2; ar & d3; } template <typename AR, typename T, typename T2, typename T3, typename T4> inline void SerializeMember(AR& ar, T& d1, T2& d2, T3& d3, T4& d4) { ar & d1; ar & d2; ar & d3; ar & d4; } template <typename AR, typename T, typename T2, typename T3, typename T4, typename T5> inline void SerializeMember(AR& ar, T& d1, T2& d2, T3& d3, T4& d4, T5& d5) { ar & d1; ar & d2; ar & d3; ar & d4; ar & d5; } template <typename AR, typename T, typename T2, typename T3, typename T4, typename T5, typename T6> inline void SerializeMember(AR& ar, T& d1, T2& d2, T3& d3, T4& d4, T5& d5, T6& d6) { ar & d1; ar & d2; ar & d3; ar & d4; ar & d5; ar & d6; } template <typename AR, typename T, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> inline void SerializeMember(AR& ar, T& d1, T2& d2, T3& d3, T4& d4, T5& d5, T6& d6, T7& d7) { ar & d1; ar & d2; ar & d3; ar & d4; ar & d5; ar & d6; ar & d7; } template <typename AR, typename T, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> inline void SerializeMember(AR& ar, T& d1, T2& d2, T3& d3, T4& d4, T5& d5, T6& d6, T7& d7, T8& d8) { ar & d1; ar & d2; ar & d3; ar & d4; ar & d5; ar & d6; ar & d7; ar & d8; } template <typename AR, typename T, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> inline void SerializeMember(AR& ar, T& d1, T2& d2, T3& d3, T4& d4, T5& d5, T6& d6, T7& d7, T8& d8, T9& d9) { ar & d1; ar & d2; ar & d3; ar & d4; ar & d5; ar & d6; ar & d7; ar & d8; ar & d9 }
변경 :
template <typename AR> class serialize_helper { AR & ar_; public: explicit serialize_helper(AR & ar) : ar_(ar) {} template <typename T> void serialize_data(T& data) { ar_ & data; } template <typename T, typename ... args> void serialize_data(T& first, args&... rest) { ar_ & first; serialize_data(rest...); } }; template <typename AR, typename ... ARGS> inline void SerializeMember(AR & ar, ARGS & ... rest) { serialize_helper<ar>(ar).serialize_data(rest...); }
댓글 없음:
댓글 쓰기
최근 게시물
이전 게시물
홈
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기