公益网站建设分析中国建设投资集团有限公司
Python marshal 模块学习笔记

1. 简介
marshal 是 Python 的内部序列化格式,主要用于序列化和反序列化 Python 对象。它是 Python 字节码(.pyc文件)使用的序列化格式,比 pickle 更原始和受限,但也更快速和安全。
 https://docs.python.org/zh-cn/3.9/library/marshal.html?highlight=marshal#module-marshal
2. 核心方法
marshal 模块提供了四个主要方法:
-  
marshal.dump(value, file)- 将 Python 对象序列化并写入文件
 - 需要以二进制写入模式打开文件(‘wb’)
 
 -  
marshal.load(file)- 从文件中读取并反序列化为 Python 对象
 - 需要以二进制读取模式打开文件(‘rb’)
 
 -  
marshal.dumps(value)- 将 Python 对象序列化为字节串
 - 返回 bytes 类型数据
 
 -  
marshal.loads(bytes)- 将字节串反序列化为 Python 对象
 - 接收 bytes 类型数据
 
 
3. 支持的数据类型
marshal 支持以下 Python 数据类型:
- None
 - 整数 (int)
 - 浮点数 (float)
 - 复数 (complex)
 - 字符串 (str)
 - 元组 (tuple)
 - 列表 (list)
 - 字典 (dict)
 - 布尔值 (bool)
 - 字节串 (bytes)
 - 代码对象 (code object)
 - 冻结集合 (frozenset)
 
4. 不支持的数据类型
marshal 不支持以下类型:
- 自定义类和实例
 - 函数和方法
 - 模块
 - 文件对象
 - 套接字对象
 - 其他复杂对象
 
5. 使用示例
5.1 使用 dump/load 操作文件
import marshal# 写入数据
data = {'name': 'qifumin', 'age': 23}
with open('data.marshal', 'wb') as f:marshal.dump(data, f)# 读取数据
with open('data.marshal', 'rb') as f:loaded_data = marshal.load(f)
 
5.2 使用 dumps/loads 操作字节串
import marshal# 序列化为字节串
data = {'languages': ['Python', 'Java', 'Go']}
bytes_data = marshal.dumps(data)# 从字节串反序列化
recovered_data = marshal.loads(bytes_data)
 
6. 注意事项
-  
版本兼容性
- 不同 Python 版本之间的 marshal 格式可能不兼容
 - 可以通过 
marshal.version查看当前版本号 
 -  
使用场景
- 主要用于 Python 内部(如.pyc文件)
 - 不建议用于长期存储或跨版本数据交换
 
 -  
替代方案
- 一般数据序列化推荐使用 
pickle - 跨语言数据交换推荐使用 
json - 配置文件推荐使用 
yaml 
 - 一般数据序列化推荐使用 
 
7. 优缺点
优点:
- 执行速度快
 - 格式简单
 - Python 内置模块,无需额外安装
 
缺点:
- 不支持复杂对象
 - 版本兼容性问题
 - 不适合长期存储
 - 不支持跨语言使用
 
8. 最佳实践
- 仅在需要高性能序列化简单数据类型时使用
 - 在使用前检查数据类型的兼容性
 - 处理文件时使用 with 语句确保正确关闭
 - 对于一般用途,优先考虑其他序列化方案
 
