00001 #ifndef _BOOST_RPC_SERIALIZATION_HPP_
00002 #define _BOOST_RPC_SERIALIZATION_HPP_
00003 #include <boost/fusion/algorithm/iteration/for_each.hpp>
00004 #include <boost/fusion/include/for_each.hpp>
00005 #include <boost/fusion/container/vector.hpp>
00006 #include <boost/fusion/include/vector.hpp>
00007 #include <boost/fusion/container/vector/vector_fwd.hpp>
00008 #include <boost/fusion/include/vector_fwd.hpp>
00009 #include <boost/fusion/container/generation/make_vector.hpp>
00010 #include <boost/fusion/include/make_vector.hpp>
00011 #include <boost/fusion/sequence/comparison/equal_to.hpp>
00012 #include <boost/fusion/include/equal_to.hpp>
00013
00014 #include <boost/archive/binary_iarchive.hpp>
00015 #include <boost/archive/binary_oarchive.hpp>
00016 #include <boost/serialization/serialization.hpp>
00017
00018 namespace boost { namespace rpc {
00019 namespace serialization {
00020 template<typename Archive>
00021 struct item_serializer
00022 {
00023 item_serializer(Archive& ar):ar(ar) {}
00024
00025 template<typename T>
00026 void operator()(const T& o) const {
00027 ar << o;
00028 }
00029 Archive& ar;
00030 };
00031
00032 template<typename Archive, typename V>
00033 Archive& serialize_fusion_vector(Archive& ar, const V& v)
00034 {
00035 boost::fusion::for_each(v, item_serializer<Archive>(ar));
00036 return ar;
00037 }
00038
00039 template<typename Archive>
00040 struct item_deserializer
00041 {
00042 item_deserializer(Archive& ar):ar(ar) {}
00043
00044 template<typename T>
00045 void operator()(T& o) const {
00046 ar >> o;
00047 }
00048 Archive& ar;
00049 };
00050
00051 template<typename Archive, typename V>
00052 Archive& deserialize_fusion_vector(Archive& ar, V& v)
00053 {
00054 boost::fusion::for_each(v, item_deserializer<Archive>(ar));
00055 return ar;
00056 }
00057
00058 }
00059 } }
00060
00061 #endif // _BOOST_RPC_SERIALIZATION_HPP_