本文目录导读:

是的,Msgpack(MessagePack) 是 Python 中一种高效的消息序列化格式,通常用于替代 JSON 或 Protocol Buffers。
主要特点
- 紧凑的二进制格式:比 JSON 更小、更快
- 跨语言支持:多种编程语言都能解析
- 支持复杂数据类型:列表、字典、字节串等
基本使用
安装
pip install msgpack
序列化与反序列化
import msgpack
# 序列化
data = {"name": "Alice", "age": 30, "scores": [85, 92, 78]}
packed = msgpack.packb(data) # 返回 bytes
# 反序列化
unpacked = msgpack.unpackb(packed)
print(unpacked) # {'name': 'Alice', 'age': 30, 'scores': [85, 92, 78]}
文件操作
# 写入文件
with open('data.msgpack', 'wb') as f:
msgpack.pack(data, f)
# 读取文件
with open('data.msgpack', 'rb') as f:
data = msgpack.unpack(f)
与 JSON 对比
import json
import msgpack
# JSON
json_data = json.dumps({"hello": "world"})
print(len(json_data)) # 16 bytes
# MessagePack
msgpack_data = msgpack.packb({"hello": "world"})
print(len(msgpack_data)) # 12 bytes(更紧凑)
高级特性
自定义类型序列化
import msgpack
from datetime import datetime
# 定义自定义编码器
def encode_custom(obj):
if isinstance(obj, datetime):
return {'__datetime__': True, 'value': obj.isoformat()}
return obj
def decode_custom(obj):
if '__datetime__' in obj:
return datetime.fromisoformat(obj['value'])
return obj
# 使用自定义编码
data = {"time": datetime.now()}
packed = msgpack.packb(data, default=encode_custom)
unpacked = msgpack.unpackb(packed, object_hook=decode_custom)
流式处理
import msgpack
# 流式打包多个对象
with open('stream.msgpack', 'wb') as f:
for item in items:
msgpack.pack(item, f)
# 流式解包
with open('stream.msgpack', 'rb') as f:
unpacker = msgpack.Unpacker(f)
for item in unpacker:
print(item)
适用场景
- 高性能网络通信:如 RPC、消息队列
- 存储紧凑数据:减少磁盘/内存占用
- 跨语言数据传输:Python↔️Java↔️Go↔️C++等
- 嵌入式系统:资源受限环境
注意事项
- 非直接人类可读:二进制格式,调试不如 JSON 方便
- 无类型校验:不像 Protocol Buffers 有强类型约束
- 安全性:反序列化不可信数据时建议用
raw=False避免代码执行风险