Python Pickle,避免模块依赖

时间:2012-07-30 05:26:58

标签: python ironpython pickle

是否有一种特定的方法来pickle对象,以便pickle.load()不依赖于任何模块?我读到,当取消对象时,Pickle尝试加载包含对象的类定义的模块。有没有办法避免这种情况,所以pickle.load()不会尝试加载任何模块?

2 个答案:

答案 0 :(得分:3)

由于对象的序列化和反序列化是pickle功能的主要目的,因此您的要求没有多大意义。如果您想要不同的东西:将对象序列化或反序列化为XML或JSON(或任何其他合适的格式)。

例如lxml.objectify或google for“Python serialize json”或“Python serialize xml”...但你不能在没有类定义的情况下从pickle中反序列化一个对象 - 至少在没有进一步编码的情况下也是如此。

http://docs.python.org/library/pickle.html

记录如何编写自定义unpickler ...也许这是一个好的开始方式 - 但这看起来像是错误的方法。

答案 1 :(得分:3)

可能有点不相关但我仍然会在文档中引用:

  

警告pickle模块不能防止错误或恶意构造的数据。切勿取消从不受信任或未经身份验证的来源收到的数据。

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

  • 通过继承pickle.Unpickler
  • 来获取自定义unpickler
  • 覆盖find_class(..)
  • 内部find_class(..)检查模块和需要加载的类。避免通过引发错误来加载它。
  • 使用此自定义类从字符串中取消选择。

Here is an excellent article关于使用泡菜的危险。您还可以找到具有上述方法的代码。