2 #ifndef comfrm_ifc_SerializerH
3 #define comfrm_ifc_SerializerH
37 #include "serializertools.h"
40 #include <forward_list>
42 #include <unordered_set>
43 #include <unordered_map>
45 #include <type_traits>
47 #define INIT_SERIALIZER(n) \
49 const char* __internal_ClassName__() const \
63 template <
typename T >
66 static const char*
get()
84 return __internal_ClassName__();
87 virtual bool serialize(std::ostream& o_out)
const = 0;
88 virtual bool deserialize(std::ostream& o_in) = 0;
91 bool serializeMember(std::ostream& o_out,
const T& p_member)
const;
94 virtual const char* __internal_ClassName__()
const = 0;
97 template <
typename T >
101 template <
class Q = T >
102 typename std::enable_if<std::is_fundamental< Q >::value>::type
103 serializeType(std::ostream& o_out,
const Q& p_member,
bool& o_ok)
105 o_ok = com::srl::serializeBaseType(o_out, p_member);
108 template <
class Q = T >
110 typename std::enable_if<std::is_base_of< std::basic_string< char >, Q >::value>::type
111 serializeType(std::ostream& o_out,
const Q& p_member,
bool& o_ok)
113 o_ok = com::srl::serializeStdString(o_out, p_member);
116 template <
class Q = T >
117 typename std::enable_if<std::is_simple_stl_container< Q >::value>::type
118 serializeType(std::ostream& o_out,
const Q& p_member,
bool& o_ok)
124 template <
class Q = T >
125 typename std::enable_if<std::is_std_set< Q >::value>::type
126 serializeType(std::ostream& o_out,
const Q& p_member,
bool& o_ok)
132 template <
class Q = T >
133 typename std::enable_if<std::is_std_map< Q >::value>::type
134 serializeType(std::ostream& o_out,
const Q& p_member,
bool& o_ok)
140 template <
class Q = T >
141 typename std::enable_if<std::is_std_unordered_map< Q >::value>::type
142 serializeType(std::ostream& o_out,
const Q& p_member,
bool& o_ok)
148 template <
class Q = T >
149 typename std::enable_if<std::is_base_of< Serializer, typename std::remove_pointer< Q >::type >::value>::type
150 serializeType(std::ostream& o_out,
const Q& p_member,
bool& o_ok)
155 o_ok = memberIfc.serialize(o_out);
157 catch(std::bad_cast p_exc)
163 template <
class Q = T >
164 typename std::enable_if<std::is_base_of< Serializer, typename std::remove_pointer< Q >::type >::value>::type
166 serializeType(std::ostream& o_out, Q*
const p_member,
bool& o_ok)
171 o_ok = memberIfc->serialize(o_out);
173 catch(std::bad_cast p_exc)
183 template <
template <
typename VT,
typename AT>
class Container,
class Value,
class Alloc>
186 return serializeValueLikedContainer< Container< Value, Alloc >, Value >(o_out, p_member);
193 template <
template <
typename VT,
typename CT,
typename AT>
class Set,
class Value,
class Comp,
class Alloc>
196 return serializeValueLikedContainer< Set< Value, Comp, Alloc >, Value >(o_out, p_member);
203 template <
template <
typename KT,
typename VT,
typename CT,
typename AT>
class Map,
class Key,
class Value,
class Comp,
class Alloc>
204 bool serializeSTLMap(std::ostream& o_out,
const Map< Key, Value, Comp, Alloc >& p_member)
206 return serializeKeyValueLikedContainer<Map< Key, Value, Comp, Alloc >, Key, Value>(o_out, p_member);
213 template <
template <
typename KT,
typename VT,
typename HT,
typename PT,
typename AT>
class UnorderedMap,
class Key,
class Value,
class Hash,
class Pred,
class Alloc>
216 return serializeKeyValueLikedContainer<UnorderedMap< Key, Value, Hash, Pred, Alloc >, Key, Value>(o_out, p_member);
220 template <
class Container,
class Value>
221 bool serializeValueLikedContainer(std::ostream& o_out,
const Container& p_member)
225 for (
auto it = p_member.begin(); it != p_member.end(); ++it)
228 ts.serializeType(o_out, *it, iterOk);
235 template <
class Container,
class Key,
class Value>
236 bool serializeKeyValueLikedContainer(std::ostream& o_out,
const Container& p_member)
239 tmp_TypeSerializer< Key > keyTS;
240 tmp_TypeSerializer< Value > valTS;
241 for (
auto it = p_member.begin(); it != p_member.end(); ++it)
244 keyTS.serializeType(o_out, it->first, iterOk);
246 valTS.serializeType(o_out, it->second, iterOk);
255 bool Serializer::serializeMember(std::ostream& o_out,
const T& p_member)
const
257 tmp_TypeSerializer< T > ts;
259 ts.serializeType(o_out, p_member, ok);
bool serializeSTLMap(std::ostream &o_out, const Map< Key, Value, Comp, Alloc > &p_member)
Definition: serializer.h:204
Definition: serializer.h:73
Интерфейс для сериализации классов
Definition: serializer.h:64
bool serializeSTLSet(std::ostream &o_out, const Set< Value, Comp, Alloc > &p_member)
Definition: serializer.h:194
bool serializeSTLUnorderedMap(std::ostream &o_out, const UnorderedMap< Key, Value, Hash, Pred, Alloc > &p_member)
Definition: serializer.h:214
bool serializeSimpleSTLContainer(std::ostream &o_out, const Container< Value, Alloc > &p_member)
Definition: serializer.h:184
Definition: serializer.h:98
std::string getClassName()
Definition: serializer.h:82