DataTranslate.py
114 lines
| 2.5 KiB
| text/x-python
|
PythonLexer
|
r568 | ''' | |
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 |