''' Created on Jul 15, 2014 @author: Miguel Urco ''' from JROSerializer import DynamicSerializer PICKLE_SERIALIZER = DynamicSerializer('cPickle') MSGPACK_SERIALIZER = DynamicSerializer('msgpack') from schainpy.model.data.jrodata import * CLASSNAME_KEY = 'classname__' def isNotClassVar(myObj): return not hasattr(myObj,'__dict__') def isDictFormat(thisValue): if type(thisValue) != type({}): return False if CLASSNAME_KEY not in thisValue.keys(): return False return True def obj2Dict(myObj, keyList=[]): if not keyList: keyList = myObj.__dict__.keys() myDict = {} myDict[CLASSNAME_KEY] = myObj.__class__.__name__ for thisKey, thisValue in myObj.__dict__.items(): if thisKey not in keyList: continue if isNotClassVar(thisValue): myDict[thisKey] = thisValue continue ## If this value is another class instance myNewDict = obj2Dict(thisValue) myDict[thisKey] = myNewDict return myDict def dict2Obj(myDict): ''' ''' if CLASSNAME_KEY not in myDict.keys(): return None className = eval(myDict[CLASSNAME_KEY]) myObj = className() for thisKey, thisValue in myDict.items(): if thisKey == CLASSNAME_KEY: continue if not isDictFormat(thisValue): setattr(myObj, thisKey, thisValue) continue myNewObj = dict2Obj(thisValue) setattr(myObj, thisKey, myNewObj) return myObj def obj2Serial(myObj, serializer='msgpack', **kwargs): if serializer == 'cPickle': SERIALIZER = PICKLE_SERIALIZER else: SERIALIZER = MSGPACK_SERIALIZER myDict = obj2Dict(myObj, **kwargs) mySerial = SERIALIZER.dumps(myDict) return mySerial def serial2Dict(mySerial, serializer='msgpack'): if serializer == 'cPickle': SERIALIZER = PICKLE_SERIALIZER else: SERIALIZER = MSGPACK_SERIALIZER return SERIALIZER.loads(mySerial) def serial2Obj(mySerial, metadataDict = {}, serializer='msgpack'): if serializer == 'cPickle': SERIALIZER = PICKLE_SERIALIZER else: SERIALIZER = MSGPACK_SERIALIZER myDataDict = SERIALIZER.loads(mySerial) if not metadataDict: myObj = dict2Obj(myDataDict) return myObj metadataDict.update(myDataDict) myObj = dict2Obj(metadataDict) return myObj