Source code for radical.pilot.utils.serializer


'''
The serializer should be able to (de)serialize information that we want
to send over the wire from the client side to the agent side via
1- ZMQ
2- MongoDB

we except:
    1- Callables with and without dependecies.
    2- Non-callables like classes and other python objects
'''
__copyright__ = 'Copyright 2022, The RADICAL-Cybertools Team'
__license__   = 'MIT'

import os
import dill
import pickle
import codecs
import tempfile


_obj_dir       = tempfile.gettempdir()
_obj_file_name = 'rp_obj.pkl'
_obj_file_path = os.path.join(_obj_dir, _obj_file_name)


# ------------------------------------------------------------------------------
#
[docs]def serialize_obj(obj): ''' serialize object ''' if callable(obj): try: return dill.dumps(obj) except: # if we fail, then pickle it by reference # see issue: https://github.com/uqfoundation/dill/issues/128 return dill.dumps(obj, byref = True) else: try: return dill.dumps(obj, recurse = True) except: # if we fail, then pickle it by reference # see issue: https://github.com/uqfoundation/dill/issues/128 return dill.dumps(obj, byref = True)
# ------------------------------------------------------------------------------ #
[docs]def serialize_file(obj, fname=None): ''' serialize object to file ''' if not fname: fname = _obj_file_path # FIXME: assign unique path and id for the pickled file # to avoid overwriting to the same file with open(fname, 'wb') as f: f.write(serialize_obj(obj)) return _obj_file_path
# ------------------------------------------------------------------------------ #
[docs]def deserialize_file(fname): ''' Deserialize object from file ''' with open(fname, 'rb') as f: return dill.load(f)
# ------------------------------------------------------------------------------ #
[docs]def deserialize_obj(data): ''' Deserialize object from str. ''' return dill.loads(data)
# ------------------------------------------------------------------------------ # def serialize_bson(obj): return codecs.encode(pickle.dumps(obj), "base64").decode() # ------------------------------------------------------------------------------ # def deserialize_bson(obj): return pickle.loads(codecs.decode(obj.encode(), "base64")) # ------------------------------------------------------------------------------