内部Python对象序列化(元帅)

即使Python标准库中的marshal模块提供了对象序列化功能(类似于pickle模块),它对于通用数据持久性或通过套接字等的Python对象传输并没有真正的用处。Python本身主要使用此模块来支持读取/在Python模块的编译版本(.pyc文件)上进行写操作。封送模块使用的数据格式在Python版本之间不兼容(甚至不兼容Subversion)。这就是为什么一个版本的已编译Python脚本(.pyc文件)很可能不会在另一版本上执行的原因。因此,marshal模块用于Python的内部对象序列化。

正如泡菜模块,名帅模块还定义load()dump()用于读取和写入封送对象从/到文件的功能。而且,loads()dumps()函数处理封送处理的对象的字符串表示形式。

dumps() -返回一个像我编组Python对象的对象一样的字节。仅支持标准数据类型的对象进行编组。不支持的类型引发ValueError异常。

loads() -此函数将类似字节的对象转换为相应的Python对象。如果转换未产生有效的Python对象,则可能引发ValueError或TypeError。

以下代码显示了使用编组的Python字典对象dumps()。字节表示通过loads()方法转换回字典。

import marshal
person = {"name":"xyz", "age":22, "marks":[45,56,78]}
data = marshal.dumps(person)
obj = marshal.loads(data)
print (obj)

dump() -此函数将支持的Python对象的字节表示形式写入文件。该文件本身是具有写入权限的二进制文件

load() -此函数从二进制文件读取字节数据,并将其转换为Python对象。

如上 ,封送模块用于处理.pyc文件。以下示例演示了如何使用dump()load()函数来处理Python的代码对象,这些代码对象用于存储预编译的Python模块。

该代码使用内置compile()函数从嵌入Python指令的源字符串中构建代码对象。

compile(source, file, mode)

file参数应该是从中读取代码的文件。如果不是从文件中读取,则传递任意字符串。

如果源包含语句序列,则模式参数为“ exec”,如果包含单个表达式,则为“ eval”,如果包含单个交互式语句,则为“单个”。

然后使用dump()方法将编译代码对象存储在.pyc文件中

import marshal
script = """
a = 10
b = 20
print ('addition = ',a+b)
"""
code = compile(script, "script", "exec")
f = open("a.pyc","wb")
marshal.dump(code, f)
f.close()

要从.pyc文件反序列化对象,请使用load()函数。由于它返回一个代码对象,因此可以使用exec()另一个内置函数来运行它。

import marshal
f = open("a.pyc","rb")
data = marshal.load(f)
exec (data)

输出将是源字符串中嵌入的代码块的结果

addition = 30