Python内部对象序列化 (marshal)
尽管Python标准库中的marshal模块提供了对象序列化功能(类似于pickle模块),但它并不真正适用于通用数据持久化或通过套接字等传输Python对象。此模块主要由Python本身用于支持编译版本的Python模块(.pyc文件)的读写操作。marshal模块使用的数据格式在Python版本之间不兼容(甚至子版本也不兼容)。这就是为什么一个版本的编译Python脚本(.pyc文件)很可能无法在另一个版本上执行的原因。因此,marshal模块用于Python的内部对象序列化。
与pickle模块一样,marshal模块也定义了load()和dump()函数,用于从文件读取和写入marshaled对象。此外,loads()和dumps()函数处理marshaled对象的字符串表示形式。
dumps() − 通过将Python对象进行marshal处理,返回一个类似字节的对象。仅支持标准数据类型的对象进行marshal处理。不支持的类型会引发ValueError异常。
loads() − 此函数将类似字节的对象转换为相应的Python对象。如果转换结果不是有效的Python对象,则可能会引发ValueError或TypeError异常。
以下代码显示了使用dumps()进行marshal处理的Python字典对象。字节表示形式通过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对象。
如上所述,marshal模块用于处理.pyc文件。以下示例演示了如何使用dump()和load()函数来处理Python的代码对象,这些对象用于存储预编译的Python模块。
该代码使用内置的compile()函数根据包含Python指令的源字符串构建代码对象。
compile(source, file, mode)
file参数应为读取代码的文件。如果未从文件读取,则传递任何任意字符串。
如果源包含一系列语句,则mode参数为'exec';如果只有一个表达式,则为'eval';如果包含单个交互式语句,则为'single'。
然后使用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
数据结构
网络
关系型数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP