16 #ifndef SERIALIZABLE_H_
17 #define SERIALIZABLE_H_
18 #include "XmlParser.h"
35 #include "DateFormat.h"
36 #include "BinaryData.h"
37 #include "Constants.h"
38 #include "AMEFResources.h"
42 typedef string (*SerPtr) (
void*);
43 typedef void* (*UnSerPtr) (string);
46 static string demangle(
const char *mangled);
47 static string getClassName(
void* instance);
48 static string _handleAllSerialization(
string className,
void *t);
49 static void* _handleAllUnSerialization(
string objXml,
string className);
50 static string _ser(
void* t,
string classN);
51 static string _servec(
void* t,
string classN);
52 static string _serlis(
void* t,
string classN);
53 static string _serset(
void* t,
string classN);
54 static string _sermultiset(
void* t,
string classN);
55 static string _serq(
void* t,
string classN);
56 static string _serdq(
void* t,
string classN);
57 static string _ser(
Object);
58 static void* _unser(
string objXml,
string classN);
59 static void* unserializevec(
AMEFObject* root,
string objXml);
60 static void* unserializelist(
AMEFObject* root,
string objXml);
61 static void* unserializeset(
AMEFObject* root,
string objXml);
62 static void* unserializemultiset(
AMEFObject* root,
string objXml);
63 static void* unserializeq(
AMEFObject* root,
string objXml);
64 static void* unserializedq(
AMEFObject* root,
string objXml);
66 static void* _unserVec(
string objXml,
string className);
67 static void* _unserLis(
string objXml,
string className);
68 static void* _unserQ(
string objXml,
string className);
69 static void* _unserDq(
string objXml,
string className);
70 static void* _unserSet(
string objXml,
string className);
71 static void* _unserMulSet(
string objXml,
string className);
73 template <
class T>
static string serializeset(set<T> t)
78 const char *mangled =
typeid(td).name();
79 string className = demangle(mangled);
80 className =
"set<" + className +
">";
83 object.setName(className);
84 while(cnt++<(
int)t.size())
86 object.addPacket(serialize<T>(*st.begin()));
89 return enc.encodeB(&
object,
false);
91 template <
class T>
static string serializemultiset(multiset<T> t)
96 const char *mangled =
typeid(td).name();
97 string className = demangle(mangled);
98 className =
"multiset<" + className +
">";
101 object.setName(className);
102 while(cnt++<(
int)t.size())
104 object.addPacket(serialize<T>(*st.begin()));
105 st.erase(st.begin());
107 return enc.encodeB(&
object,
false);
109 template <
class T>
static string serializevec(vector<T> t)
114 const char *mangled =
typeid(td).name();
115 string className = demangle(mangled);
116 className =
"vector<" + className +
">";
119 object.setName(className);
120 while(cnt++<(
int)t.size())
122 object.addPacket(serialize<T>(*st.begin()));
123 st.erase(st.begin());
125 return enc.encodeB(&
object,
false);
127 template <
class T>
static string serializedq(deque<T> t)
132 const char *mangled =
typeid(td).name();
133 string className = demangle(mangled);
134 className =
"deque<" + className +
">";
137 object.setName(className);
138 while(cnt++<(
int)t.size())
140 object.addPacket(serialize<T>(*st.begin()));
141 st.erase(st.begin());
143 return enc.encodeB(&
object,
false);
145 template <
class T>
static string serializelist(list<T> t)
150 const char *mangled =
typeid(td).name();
151 string className = demangle(mangled);
152 className =
"list<" + className +
">";
155 object.setName(className);
156 while(cnt++<(
int)t.size())
158 object.addPacket(serialize<T>(*st.begin()));
159 st.erase(st.begin());
161 return enc.encodeB(&
object,
false);
163 template <
class T>
static string serializeq(std::queue<T> t)
165 std::queue<T> tt = t;
167 const char *mangled =
typeid(td).name();
168 string className = demangle(mangled);
169 className =
"queue<" + className +
">";
172 object.setName(className);
175 for(
int var=0;var<(int)tt.size();var++)
177 object.addPacket(serialize<T>(tt.front()));
181 return enc.encodeB(&
object,
false);
207 template <
class T>
static string serialize(T t)
210 const char *mangled =
typeid(t).name();
211 string className = demangle(mangled);
212 return _handleAllSerialization(className,&t);
214 static string serializeObject(
Object t)
216 return _handleAllSerialization(t.getTypeName(),t.getVoidPointer());
219 static string serializeUnknown(
void* t,
string className)
221 return _handleAllSerialization(className,t);
224 template <
class K,
class V>
static string serialize(map<K,V> mp)
230 const char *mangled =
typeid(k).name();
231 string kclassName = demangle(mangled);
233 *mangled =
typeid(v).name();
234 string vclassName = demangle(mangled);
235 kclassName =
"map<"+kclassName+
":"+vclassName+
">";
236 object.setName(kclassName);
237 while (mpt.begin()!=mpt.end())
239 string key = serialize<K>(mpt.begin()->first);
240 string value = serialize<V>(mpt.begin()->second);
241 mpt.erase(mpt.begin());
242 object.addPacket(value, key);
244 return enc.encodeB(&
object,
false);
247 template <
class K,
class V>
static string serialize(multimap<K,V> mp)
249 multimap<K,V> mpt = mp;
253 const char *mangled =
typeid(k).name();
254 string kclassName = demangle(mangled);
256 *mangled =
typeid(v).name();
257 string vclassName = demangle(mangled);
258 kclassName =
"multimap<"+kclassName+
":"+vclassName+
">";
259 object.setName(kclassName);
260 while (mpt.begin()!=mpt.end())
262 string key = serialize<K>(mpt.begin()->first);
263 string value = serialize<V>(mpt.begin()->second);
264 mpt.erase(mpt.begin());
265 object.addPacket(value, key);
267 return enc.encodeB(&
object,
false);
270 template <
class T> T
static unserialize(
string objXml)
273 const char *mangled =
typeid(t).name();
274 string className = demangle(mangled);
275 return *(T*)_handleAllUnSerialization(objXml,className);
278 static void* unSerializeUnknown(
string objXml,
string className)
280 return _handleAllUnSerialization(objXml,className);