Mat*_*Mat 8 python soap pickle suds
为了避免在开发过程中反复访问SOAP服务器,我正在尝试缓存结果,这样我就可以运行其余的代码,而无需每次都查询服务器.
使用下面的代码,我得到一个PicklingError: Can't pickle <class suds.sudsobject.AdvertiserSearchResponse at 0x03424060>: it's not found as suds.sudsobject.AdvertiserSearchResponse
当我尝试挑选肥皂水果的结果.我想这是因为这些类是动态创建的.
import pickle
from suds.client import Client
client = Client(...)
result = client.service.search(...)
file = open('test_pickle.dat', 'wb')
pickle.dump(result, file, -1)
file.close()
Run Code Online (Sandbox Code Playgroud)
如果我删除-1
协议版本 pickle.dump(result, file, -1)
,我会得到一个不同的错误:
TypeError: a class that defines __slots__ without defining __getstate__ cannot be pickled
Run Code Online (Sandbox Code Playgroud)
酸洗是正确的吗?我可以让它运作吗?有没有更好的办法?
正如您当前收到的错误消息是试图告诉您,您正在尝试挑选不可挑选的实例(在您现在使用的古老传统的pickle协议中),因为他们的类定义__slots__
但不是__getstate__
方法.
然而,即使改变他们的类也无济于事,因为那时你会遇到另一个问题 - 你已经正确地认识到这可能是由于动态生成的类.所有pickle
协议都"按名称"序列化类(和函数),基本上将它们限制在模块中的顶级名称.而且,绝对序列化的实例并不需要序列化类(怎么回事你能可能以后重建例如,如果类不在身边?!).
所以你需要以其他方式保存和重新加载你的数据,打破你当前对具体类的直接依赖suds.sudsobject
,转而依赖于一个接口(正式化或只是通过鸭子类型定义),这可以通过这样的具体实现实际访问SOAP服务器时的类,或者当您从文件加载数据时更简单的"自制"类.(表示实例状态的数据无疑可以表示为dict,因此如果您真的需要,可以强制它通过pickle,例如通过copy_reg
允许您自定义序列化/反序列化协议的模块,您必须处理非对象的对象-invasively [[所以你不能在__getstate__
他们的类中添加或类似]] - 只有在这些对象之间存在丰富的相互引用网格时才会出现问题.
归档时间: |
|
查看次数: |
4196 次 |
最近记录: |