23 #include "JSONSerialize.h"
25 string JSONSerialize::demangle(
const char *mangled)
27 int status;
char *demangled;
29 demangled = __cxa_demangle(mangled, NULL, 0, &status);
34 string JSONSerialize::getClassName(
void* instance)
36 const char *mangled =
typeid(instance).name();
37 return demangle(mangled);
40 string JSONSerialize::_handleAllSerialization(
string className,
void *t)
43 if(className==
"std::string" || className==
"string")
45 string tem = *(
string*)t;
46 objXml =
"\""+CastUtil::lexical_cast<
string>(tem)+
"\"";
48 else if(className==
"int")
51 objXml = CastUtil::lexical_cast<
string>(tem);
53 else if(className==
"short")
55 short tem = *(
short*)t;
56 objXml = CastUtil::lexical_cast<
string>(tem);
58 else if(className==
"long")
61 objXml = CastUtil::lexical_cast<
string>(tem);
63 else if(className==
"float")
65 float tem = *(
float*)t;
66 objXml = CastUtil::lexical_cast<
string>(tem);
68 else if(className==
"double")
70 double tem = *(
double*)t;
71 objXml = CastUtil::lexical_cast<
string>(tem);
73 else if(className==
"bool")
76 objXml = CastUtil::lexical_cast<
string>(tem);
78 else if(className==
"Date")
81 objXml =
"\""+formt.format(*(
Date*)t)+
"\"";
83 else if(className==
"BinaryData")
85 objXml =
"\""+BinaryData::serilaize(*(
BinaryData*)t)+
"\"";
87 else if(className.find(
"std::vector<std::string,")!=string::npos || className.find(
"std::vector<string,")!=string::npos)
89 vector<string> *tt = (vector<string>*)t;
90 objXml = serializevec<string>(*tt);
92 else if(className.find(
"std::vector<int,")!=string::npos)
94 vector<int> *tt = (vector<int>*)t;
95 objXml = serializevec<int>(*tt);
97 else if(className.find(
"std::vector<short,")!=string::npos)
99 vector<short> *tt = (vector<short>*)t;
100 objXml = serializevec<short>(*tt);
102 else if(className.find(
"std::vector<long,")!=string::npos)
104 vector<long> *tt = (vector<long>*)t;
105 objXml = serializevec<long>(*tt);
107 else if(className.find(
"std::vector<double,")!=string::npos)
109 vector<double> *tt = (vector<double>*)t;
110 objXml = serializevec<double>(*tt);
112 else if(className.find(
"std::vector<float,")!=string::npos)
114 vector<float> *tt = (vector<float>*)t;
115 objXml = serializevec<float>(*tt);
117 else if(className.find(
"std::vector<bool,")!=string::npos)
119 vector<bool> *tt = (vector<bool>*)t;
120 objXml = serializevec<bool>(*tt);
122 else if(className.find(
"std::vector<")!=string::npos)
124 StringUtil::replaceFirst(className,
"std::vector<",
"");
125 string vtyp = className.substr(0,className.find(
","));
126 return _serContainers(t,vtyp,
"Vec");
128 else if(className.find(
"std::list<std::string,")!=string::npos || className.find(
"std::list<string,")!=string::npos)
130 list<string> *tt = (list<string>*)t;
131 objXml = serializelist<string>(*tt);
133 else if(className.find(
"std::list<int,")!=string::npos)
135 list<int> *tt = (list<int>*)t;
136 objXml = serializelist<int>(*tt);
138 else if(className.find(
"std::list<long,")!=string::npos)
140 list<long> *tt = (list<long>*)t;
141 objXml = serializelist<long>(*tt);
143 else if(className.find(
"std::list<short,")!=string::npos)
145 list<short> *tt = (list<short>*)t;
146 objXml = serializelist<short>(*tt);
148 else if(className.find(
"std::list<double,")!=string::npos)
150 list<double> *tt = (list<double>*)t;
151 objXml = serializelist<double>(*tt);
153 else if(className.find(
"std::list<float,")!=string::npos)
155 list<float> *tt = (list<float>*)t;
156 objXml = serializelist<float>(*tt);
158 else if(className.find(
"std::list<bool,")!=string::npos)
160 list<bool> *tt = (list<bool>*)t;
161 objXml = serializelist<bool>(*tt);
163 else if(className.find(
"std::list<")!=string::npos)
165 StringUtil::replaceFirst(className,
"std::list<",
"");
166 string vtyp = className.substr(0,className.find(
","));
167 return _serContainers(t,vtyp,
"Lis");
169 else if(className.find(
"std::set<std::string,")!=string::npos || className.find(
"std::set<string,")!=string::npos)
171 set<string> *tt = (set<string>*)t;
172 objXml = serializeset<string>(*tt);
174 else if(className.find(
"std::set<int,")!=string::npos)
176 set<int> *tt = (set<int>*)t;
177 objXml = serializeset<int>(*tt);
179 else if(className.find(
"std::set<short,")!=string::npos)
181 set<short> *tt = (set<short>*)t;
182 objXml = serializeset<short>(*tt);
184 else if(className.find(
"std::set<long,")!=string::npos)
186 set<long> *tt = (set<long>*)t;
187 objXml = serializeset<long>(*tt);
189 else if(className.find(
"std::set<double,")!=string::npos)
191 set<double> *tt = (set<double>*)t;
192 objXml = serializeset<double>(*tt);
194 else if(className.find(
"std::set<float,")!=string::npos)
196 set<float> *tt = (set<float>*)&t;
197 objXml = serializeset<float>(*tt);
199 else if(className.find(
"std::set<bool,")!=string::npos)
201 set<bool> *tt = (set<bool>*)&t;
202 objXml = serializeset<bool>(*tt);
204 else if(className.find(
"std::set<")!=string::npos)
206 StringUtil::replaceFirst(className,
"std::set<",
"");
207 string vtyp = className.substr(0,className.find(
","));
208 return _serContainers(t,vtyp,
"Set");
210 else if(className.find(
"std::multiset<std::string,")!=string::npos || className.find(
"std::multiset<string,")!=string::npos)
212 multiset<string> *tt = (multiset<string>*)t;
213 objXml = serializemultiset<string>(*tt);
215 else if(className.find(
"std::multiset<int,")!=string::npos)
217 multiset<int> *tt = (multiset<int>*)t;
218 objXml = serializemultiset<int>(*tt);
220 else if(className.find(
"std::multiset<long,")!=string::npos)
222 multiset<long> *tt = (multiset<long>*)t;
223 objXml = serializemultiset<long>(*tt);
225 else if(className.find(
"std::multiset<short,")!=string::npos)
227 multiset<short> *tt = (multiset<short>*)t;
228 objXml = serializemultiset<short>(*tt);
230 else if(className.find(
"std::multiset<double,")!=string::npos)
232 multiset<double> *tt = (multiset<double>*)t;
233 objXml = serializemultiset<double>(*tt);
235 else if(className.find(
"std::multiset<float,")!=string::npos)
237 multiset<float> *tt = (multiset<float>*)t;
238 objXml = serializemultiset<float>(*tt);
240 else if(className.find(
"std::multiset<bool,")!=string::npos)
242 multiset<bool> *tt = (multiset<bool>*)t;
243 objXml = serializemultiset<bool>(*tt);
245 else if(className.find(
"std::multiset<")!=string::npos)
247 StringUtil::replaceFirst(className,
"std::multiset<",
"");
248 string vtyp = className.substr(0,className.find(
","));
249 return _serContainers(t,vtyp,
"MulSet");
251 else if(className.find(
"std::queue<std::string,")!=string::npos || className.find(
"std::queue<string,")!=string::npos)
253 std::queue<string> *tt = (std::queue<string>*)t;
254 objXml = serializeq<string>(*tt);
256 else if(className.find(
"std::queue<int,")!=string::npos)
258 std::queue<int> *tt = (std::queue<int>*)t;
259 objXml = serializeq<int>(*tt);
261 else if(className.find(
"std::queue<short,")!=string::npos)
263 std::queue<short> *tt = (std::queue<short>*)t;
264 objXml = serializeq<short>(*tt);
266 else if(className.find(
"std::queue<long,")!=string::npos)
268 std::queue<long> *tt = (std::queue<long>*)t;
269 objXml = serializeq<long>(*tt);
271 else if(className.find(
"std::queue<double,")!=string::npos)
273 std::queue<double> *tt = (std::queue<double>*)t;
274 objXml = serializeq<double>(*tt);
276 else if(className.find(
"std::queue<float,")!=string::npos)
278 std::queue<float> *tt = (std::queue<float>*)t;
279 objXml = serializeq<float>(*tt);
281 else if(className.find(
"std::queue<bool,")!=string::npos)
283 std::queue<bool> *tt = (std::queue<bool>*)t;
284 objXml = serializeq<bool>(*tt);
286 else if(className.find(
"std::queue<")!=string::npos)
288 StringUtil::replaceFirst(className,
"std::queue<",
"");
289 string vtyp = className.substr(0,className.find(
","));
290 return _serContainers(t,vtyp,
"Q");
292 else if(className.find(
"std::deque<std::string,")!=string::npos || className.find(
"std::deque<string,")!=string::npos)
294 deque<string> *tt = (deque<string>*)t;
295 objXml = serializedq<string>(*tt);
297 else if(className.find(
"std::deque<int,")!=string::npos)
299 deque<int> *tt = (deque<int>*)t;
300 objXml = serializedq<int>(*tt);
302 else if(className.find(
"std::deque<long,")!=string::npos)
304 deque<long> *tt = (deque<long>*)t;
305 objXml = serializedq<long>(*tt);
307 else if(className.find(
"std::deque<short,")!=string::npos)
309 deque<short> *tt = (deque<short>*)t;
310 objXml = serializedq<short>(*tt);
312 else if(className.find(
"std::deque<double,")!=string::npos)
314 deque<double> *tt = (deque<double>*)t;
315 objXml = serializedq<double>(*tt);
317 else if(className.find(
"std::deque<float,")!=string::npos)
319 deque<float> *tt = (deque<float>*)t;
320 objXml = serializedq<float>(*tt);
322 else if(className.find(
"std::deque<bool,")!=string::npos)
324 deque<bool> *tt = (deque<bool>*)t;
325 objXml = serializedq<bool>(*tt);
327 else if(className.find(
"std::deque<")!=string::npos)
329 StringUtil::replaceFirst(className,
"std::deque<",
"");
330 string vtyp = className.substr(0,className.find(
","));
331 return _serContainers(t,vtyp,
"Dq");
335 return _ser(t,className);
341 string JSONSerialize::_serContainers(
void* t,
string className,
string type)
344 string libName = Constants::INTER_LIB_FILE;
345 void *dlib = dlopen(libName.c_str(), RTLD_NOW);
348 cerr << dlerror() << endl;
351 string methodname =
"from"+className+type+
"VPToJSON";
352 void *mkr = dlsym(dlib, methodname.c_str());
353 typedef string (*RfPtr) (
void*);
354 RfPtr f = (RfPtr)mkr;
360 string JSONSerialize::_ser(
void* t,
string className)
363 string libName = Constants::INTER_LIB_FILE;
364 void *dlib = dlopen(libName.c_str(), RTLD_NOW);
367 cerr << dlerror() << endl;
370 string methodname =
"from"+className+
"VPToJSON";
371 void *mkr = dlsym(dlib, methodname.c_str());
372 typedef string (*RfPtr) (
void*);
373 RfPtr f = (RfPtr)mkr;
379 string JSONSerialize::_ser(
Object t)
381 return _ser(t.getVoidPointer(),t.getTypeName());
385 void* JSONSerialize::_handleAllUnSerialization(
string json,
string className)
387 if(className==
"std::string" || className==
"string" || className==
"int" || className==
"short" || className==
"float" || className==
"double"
388 || className==
"long" || className==
"bool")
393 *vt = CastUtil::lexical_cast<
int>(json);
396 else if(className==
"long")
399 *vt = CastUtil::lexical_cast<
long>(json);
402 else if(className==
"short")
404 short *vt =
new short;
405 *vt = CastUtil::lexical_cast<
short>(json);
408 else if(className==
"Date")
412 return formt.parse(json.substr(1, json.length()-1));
418 else if(className==
"BinaryData")
421 return BinaryData::unSerilaize(json.substr(1, json.length()-1));
425 else if(className==
"float")
427 float *vt =
new float;
428 *vt = CastUtil::lexical_cast<
float>(json);
431 else if(className==
"double")
433 double *vt =
new double;
434 *vt = CastUtil::lexical_cast<
double>(json);
437 else if(className==
"bool")
440 *vt = CastUtil::lexical_cast<
bool>(json);
443 else if(className==
"std::string" || className==
"string")
445 string *vt =
new string;
447 *vt = CastUtil::lexical_cast<string>(json.substr(1, json.length()-1));
451 else if(className.find(
"std::vector<")==0)
453 StringUtil::replaceFirst(className,
"std::vector<",
"");
454 StringUtil::replaceFirst(className,
">",
"");
455 return unserializeConatiner(json, className,
"Vec");
457 else if(className.find(
"std::list<")==0)
459 StringUtil::replaceFirst(className,
"std::vector<",
"");
460 StringUtil::replaceFirst(className,
">",
"");
461 return unserializeConatiner(json, className,
"Lis");
463 else if(className.find(
"std::set<")==0)
465 StringUtil::replaceFirst(className,
"std::vector<",
"");
466 StringUtil::replaceFirst(className,
">",
"");
467 return unserializeConatiner(json, className,
"Set");
469 else if(className.find(
"std::multiset<")==0)
471 StringUtil::replaceFirst(className,
"std::vector<",
"");
472 StringUtil::replaceFirst(className,
">",
"");
473 return unserializeConatiner(json, className,
"MulSet");
475 else if(className.find(
"std::queue<")==0)
477 StringUtil::replaceFirst(className,
"std::vector<",
"");
478 StringUtil::replaceFirst(className,
">",
"");
479 return unserializeConatiner(json, className,
"Q");
481 else if(className.find(
"std::deque<")==0)
483 StringUtil::replaceFirst(className,
"std::vector<",
"");
484 StringUtil::replaceFirst(className,
">",
"");
485 return unserializeConatiner(json, className,
"Dq");
487 return _unser(json,className);
490 void* JSONSerialize::unserializeConatiner(
string json,
string className,
string type)
492 if(className==
"string" || className==
"std::string")
495 vector<string> *t = JSONUtil::toVectorP<string>(root);
496 return unserContainer<string>(*t, type);
498 else if(className==
"double")
501 vector<double> *t = JSONUtil::toVectorP<double>(root);
502 return unserContainer<double>(*t, type);
504 else if(className==
"float")
507 vector<float> *t = JSONUtil::toVectorP<float>(root);
508 return unserContainer<float>(*t, type);
510 else if(className==
"int")
513 vector<int> *t = JSONUtil::toVectorP<int>(root);
514 return unserContainer<int>(*t, type);
516 else if(className==
"short")
519 vector<short> *t = JSONUtil::toVectorP<short>(root);
520 return unserContainer<short>(*t, type);
522 else if(className==
"long")
525 vector<long> *t = JSONUtil::toVectorP<long>(root);
526 return unserContainer<long>(*t, type);
528 else if(className==
"bool")
531 vector<bool> *t = JSONUtil::toVectorP<bool>(root);
532 return unserContainer<bool>(*t, type);
535 return _unserCont(json,className, type);
539 void* JSONSerialize::_unserCont(
string objXml,
string className,
string type)
542 string libName = Constants::INTER_LIB_FILE;
543 void *dlib = dlopen(libName.c_str(), RTLD_NOW);
546 cerr << dlerror() << endl;
549 string methodname =
"to"+className+type+
"VP";
550 void *mkr = dlsym(dlib, methodname.c_str());
551 typedef void* (*RfPtr) (string);
552 RfPtr f = (RfPtr)mkr;
561 void* JSONSerialize::_unser(
string objXml,
string className)
564 string libName = Constants::INTER_LIB_FILE;
565 void *dlib = dlopen(libName.c_str(), RTLD_NOW);
568 cerr << dlerror() << endl;
571 string methodname =
"toVoidP"+className;
572 void *mkr = dlsym(dlib, methodname.c_str());
573 typedef void* (*RfPtr) (string);
574 RfPtr f = (RfPtr)mkr;