책읽는잉여의 구글블로그
2014년 7월 23일 수요일
boost::serialization
boost::serialization 을 이용한 간단한 직렬화 역직렬화 코드이다.
#pragma warning ( push ) #pragma warning ( disable:4244 ) #include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef std::vector
STREAM_BUFFER_TYPE; typedef boost::iostreams::back_insert_device
BOOST_STREAM_DEVICE; typedef boost::iostreams::basic_array_source
BOOST_ARRAY_DEVICE; typedef boost::iostreams::stream
OUT_STREAM_TYPE; typedef boost::iostreams::stream_buffer
IN_STREAM_TYPE; template
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
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
class serialize_helper { AR & ar_; public: explicit serialize_helper(AR & ar) : ar_(ar) {} template
void serialize_data(T& data) { ar_ & data; } template
void serialize_data(T& first, args&... rest) { ar_ & first; serialize_data(rest...); } }; template
inline void SerializeMember(AR & ar, ARGS & ... rest) { serialize_helper
(ar).serialize_data(rest...); } #pragma warning ( pop ) struct sample_data { int id; std::string name; private: friend class boost::serialization::access; template
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
inline void SerializeMember(AR& ar, T& d1) { ar & d1; } template
inline void SerializeMember(AR& ar, T& d1, T2& d2) { ar & d1; ar & d2; } template
inline void SerializeMember(AR& ar, T& d1, T2& d2, T3& d3) { ar & d1; ar & d2; ar & d3; } template
inline void SerializeMember(AR& ar, T& d1, T2& d2, T3& d3, T4& d4) { ar & d1; ar & d2; ar & d3; ar & d4; } template
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
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
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
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
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
class serialize_helper { AR & ar_; public: explicit serialize_helper(AR & ar) : ar_(ar) {} template
void serialize_data(T& data) { ar_ & data; } template
void serialize_data(T& first, args&... rest) { ar_ & first; serialize_data(rest...); } }; template
inline void SerializeMember(AR & ar, ARGS & ... rest) { serialize_helper
(ar).serialize_data(rest...); }
댓글 없음:
댓글 쓰기
최근 게시물
이전 게시물
홈
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기