Is there a particular way to pickle objects so that pickle.load() has no dependencies on any modules? I read that while unpickling objects, Pickle tries to load the module containing the class definition of the object. Is there a way to avoid this, so that pickle.load() doesnt try to load any modules?
问问题
1787 次
2 回答
4
可能有点无关,但我仍然会从文档中引用:
警告 pickle 模块并非旨在防止错误或恶意构造的数据。永远不要取消从不受信任或未经身份验证的来源收到的数据。
您需要编写一个自定义的 unpickler 来避免加载额外的模块。一般的方法是:
- 通过子类化派生您的自定义 unpickler
pickle.Unpickler
- 覆盖
find_class(..)
- 在里面
find_class(..)
检查模块和需要加载的类。避免通过引发错误来加载它。 - 使用此自定义类从字符串中提取。
这是一篇关于使用泡菜的危险的优秀文章。您还将找到具有上述方法的代码。
于 2012-07-30T06:08:22.297 回答
2
由于对象的序列化和反序列化是泡菜功能的主要目的,因此您的要求没有多大意义。如果您想要不同的东西:将您的对象序列化或反序列化为 XML 或 JSON(或任何其他合适的格式)。
有例如 lxml.objectify 或者你用谷歌搜索“Python 序列化 json”或“Python 序列化 xml”......但是如果没有它的类定义,你不能从泡菜中反序列化一个对象 - 至少在没有进一步编码的情况下不能。
http://docs.python.org/library/pickle.html
记录如何编写自定义 unpickler...也许这是一个很好的开始方式 - 但这似乎是错误的做法。
于 2012-07-30T05:44:50.437 回答