Answers:
我遇到的一些用途:
1)将程序的状态数据保存到磁盘,以便它可以在重新启动时从中断处继续执行(持久性)
2)在多核或分布式系统中通过TCP连接发送python数据(编组)
3)将python对象存储在数据库中
4)将任意python对象转换为字符串,以便可以将其用作字典键(例如,用于缓存和备忘录)。
最后一个存在一些问题-两个相同的对象可以被腌制并导致不同的字符串-甚至相同的对象两次被腌制也可以具有不同的表示形式。这是因为泡菜可以包括参考计数信息。
为了强调@lunaryorn的评论-切勿从不可靠的来源获取字符串,因为精心制作的pickle可以在系统上执行任意代码。例如,请参阅https://blog.nelhage.com/2011/03/exploiting-pickle/
最小往返次数示例
>>> import pickle
>>> a = Anon()
>>> a.foo = 'bar'
>>> pickled = pickle.dumps(a)
>>> unpickled = pickle.loads(pickled)
>>> unpickled.foo
'bar'
编辑:但作为酸洗的现实世界的例子的问题,也许在最先进的使用酸洗的(你必须相当深挖掘到源)ZODB: http://svn.zope.org/
否则,PyPI会提到几个:http ://pypi.python.org/pypi?:action=search&term=pickle&submit=search
我个人已经看到了几个通过网络发送的腌制对象的示例,它们是一种易于使用的网络传输协议。
对于初学者(就像我一样),很难理解为什么在阅读官方文档时首先使用泡菜。可能是因为文档暗示您已经知道序列化的全部目的。仅在阅读了序列化的一般说明之后,我才了解该模块的原因及其常见用例。不考虑特定编程语言的序列化的广泛解释也可能会有所帮助:https : //stackoverflow.com/a/14482962/4383472,什么是序列化?, https://stackoverflow.com/a/3984483/4383472