擅长:python、mysql、java
<p>Pickle是不安全的,因为它通过调用任意函数来构造任意Python对象。然而,这也使它能够序列化几乎所有的Python对象,而不需要任何样板文件,甚至不需要白/黑列表(在一般情况下)。对于某些用例来说,这是非常理想的:</p>
<ul>
<li>快速简单的序列化,例如暂停和恢复长时间运行但简单的脚本。这里的问题都不重要,您只想按原样转储程序的状态,然后再加载它。</li>
<li>向其他进程或计算机发送任意Python数据,如<code>multiprocessing</code>。安全问题<em>可能</em>适用(但大多数情况下不适用),通用性是绝对必要的,人类不必阅读它。</li>
</ul>
<p>在其他情况下,这些缺点都不足以证明将内容映射到JSON或其他限制性数据模型的工作是正确的。也许你不需要人的可读性/安全性/跨语言兼容性,或者你可以不需要。记住,你不需要它。使用JSON是正确的™ 但权利并不总是等同于善。</p>
<p>你会注意到我完全忽略了“慢”的缺点。这是因为它有部分误导性:Pickle对于完全符合JSON模型(字符串、数字、数组、映射)的数据确实较慢,但是如果您的数据是这样的,那么您应该出于其他原因使用JSON。如果您的数据不是这样的(很可能),您还需要考虑将对象转换为JSON数据所需的自定义代码,以及将JSON数据转换回对象所需的自定义代码。它同时增加了工程工作和运行时开销,这些开销必须根据具体情况进行量化。</p>