You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中msgpack字典字符串键反序列化为bytes的问题及解决问询

解决Msgpack序列化字符串键字典后反序列化键变为bytes的问题

这个坑我之前踩过!确实挺头疼的——用msgpack序列化带字符串键的字典后,反序列化出来的键居然变成了bytes类型,导致用原字符串访问直接报KeyError。别担心,有几个简单的解决办法:

方法1:加载时用raw=False参数(最推荐)

这是最直接的官方解决方案,在调用msgpack.loads()的时候加上raw=False,msgpack会自动把所有bytes类型的键和值转换回字符串:

import msgpack

d = {'key': 1234}
binary = msgpack.dumps(d)
new_d = msgpack.loads(binary, raw=False)
print(new_d['key'])  # 顺利输出1234,不会触发KeyError

主流版本的msgpack都支持这个参数,兼容性没问题,优先用这个。

方法2:手动转换字典的键

如果因为环境限制没法用raw=False,可以手动遍历反序列化后的字典,把bytes键解码成字符串:

import msgpack

d = {'key': 1234}
binary = msgpack.dumps(d)
new_d = msgpack.loads(binary)
# 把所有bytes键转成utf-8字符串(如果你的键用了其他编码,替换成对应的就行)
fixed_dict = {k.decode('utf-8'): v for k, v in new_d.items()}
print(fixed_dict['key'])  # 正常访问无压力

方法3:序列化时指定字符串类型

在序列化的时候加上use_bin_type=False,让msgpack把字符串序列化为msgpack标准的字符串类型,而不是二进制类型,这样反序列化时直接得到字符串:

import msgpack

d = {'key': 1234}
binary = msgpack.dumps(d, use_bin_type=False)
new_d = msgpack.loads(binary)
print(new_d['key'])  # 直接用原字符串键访问没问题

不过要注意,这个方法需要序列化和反序列化的两端都保持一致的参数设置,不然可能出现兼容性问题。

其实这个问题是因为msgpack早期默认把字符串当作二进制数据处理,现在通过这些参数就能轻松解决,完全不影响正常使用msgpack的~

内容的提问来源于stack exchange,提问作者nmlq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:36:17