4

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?

4

2 回答 2

4

可能有点无关,但我仍然会从文档中引用:

警告 pickle 模块并非旨在防止错误或恶意构造的数据。永远不要取消从不受信任或未经身份验证的来源收到的数据。

您需要编写一个自定义的 unpickler 来避免加载额外的模块。一般的方法是:

  • 通过子类化派生您的自定义 unpicklerpickle.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 回答