泡菜:不安全还是不快?


问题内容

我正在研究一些scipy讲座(http://scipy-
lectures.github.io/intro/language/standard_library.html#pickle-easy-
persistence

),并且遇到了有关Pickle的声明:

Useful to store arbitrary objects to a file. Not safe or fast!

这是什么意思?不安全(根据Pickle文档),例如不是从未知来源解开文件吗?还是不安全,因为您不总是检索原始对象?

什么是更安全,更快捷的选择?我知道cPickle速度更快,但我认为它不能解决上述更安全的定义。

谢谢。


问题答案:

设计中容易在生产代码中使用pickle。任意代码可以被执行 ,同时 取储存。您可以安全地仅释放来自可信来源的数据。
切勿挑剔从不可信或未经身份验证的来源收到的数据。

实际应用示例请参见此处

至于更快的替代方法,则有marshalpython
内部
实现库。但是与pickle(或cPickle,这只是C实现)不同,它不稳定(请参阅docs),其输出是体系结构和os
independend,取决于python版本。这就是说,在Windows平台上使用python 2.7.5编组的对象保证在OS X或安装了python
2.7.5的Ubuntu上是不可编组的,但不能保证在Windows上使用python 2.6不可编组。

通过设计,另一个更快,更安全,但功能较少的序列化替代方案是JSON