pickle.dumps()
产生一个bytes
对象。期望这些任意字节是有效的UTF-8文本(您通过尝试将其解码为UTF-8的字符串所做出的假设)是相当乐观的。如果能奏效,那将是一个巧合!
一种解决方案是使用完全使用ASCII字符的较早的酸洗协议。仍然显示为bytes
,但是由于它是纯ASCII格式,因此可以轻松解码为字符串:
pickled = pickle.dumps(obj, 0).decode()
您还可以使用其他一些编码方法将经过二进制处理的对象编码为文本,例如base64:
import codecs
pickled = codecs.encode(pickle.dumps(obj), "base64").decode()
解码将是:
unpickled = pickle.loads(codecs.decode(pickled.encode(), "base64"))
pickle
与协议0一起使用似乎会导致字符串比base64编码的二进制泡菜更短(并且abarnert提出的十六进制编码的建议甚至会比base64更大),但是我还没有对其进行严格的测试。用您的数据进行测试并查看。