我正在尝试理解Python2库remotely,它通过xmlrpc帮助远程运行代码。
在客户端,作者使用marshal转储对象,并使用pickle加载从服务器返回的结果:
def run(self, func, *args, **kwds):
code_str = base64.b64encode(marshal.dumps(func.func_code))
output = self.proxy.run(self.api_key, self.a_sync, code_str, *args, **kwds)
return pickle.loads(base64.b64decode(output))
在服务器端,他正在做相反的事情:
def run(self, api_key, a_sync, func_str, *args, **kwds):
#... truncated code
code = marshal.loads(base64.b64decode(func_str))
func = types.FunctionType(code, globals(), "remote_func")
#... truncated code
output = func(*args, **kwds)
output = base64.b64encode(pickle.dumps(output))
return output
使用marshal进行转储并使用pickle加载结果的目的是什么?(反之亦然)