是否有一种特定的方法来pickle对象,以便pickle.load()不依赖于任何模块?我读到,当取消对象时,Pickle尝试加载包含对象的类定义的模块。有没有办法避免这种情况,所以pickle.load()不会尝试加载任何模块?
答案 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
find_class(..)
find_class(..)
检查模块和需要加载的类。避免通过引发错误来加载它。Here is an excellent article关于使用泡菜的危险。您还可以找到具有上述方法的代码。