我怎样才能得到泡菜泡沫结果?

2023-11-27

为了避免在开发过程中重复访问 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()

如果我放弃-1协议版本来自pickle.dump(result, file, -1),我得到一个不同的错误:

TypeError: a class that defines __slots__ without defining __getstate__ cannot be pickled

腌制是正确的做法吗?我能让它发挥作用吗?有没有更好的办法?


由于您当前收到的错误消息试图告诉您,您正在尝试腌制实例notpicklable (在您现在使用的古老遗留 pickle 协议中),因为它们的类定义__slots__但不是__getstate__ method.

然而,即使改变他们的班级也无济于事,因为那样你就会遇到other问题——您已经正确地识别出该问题可能是由于动态生成的类造成的。全部pickle协议“按名称”序列化类(和函数),本质上将它们限制为模块中的顶级名称。并且,绝对序列化实例does需要序列化该类(如果该类不存在,您以后怎么可能重建该实例?!)。

因此,您需要以其他方式保存和重新加载数据,打破当前对具体类的直接依赖suds.sudsobject有利于依赖于一个接口(无论是形式化的还是仅由鸭子类型定义的),当您实际上访问 SOAP 服务器时,可以通过此类具体类来实现该接口,或者当您从 SOAP 服务器加载数据时,可以通过更简单的“自制”接口来实现该接口一份文件。 (表示实例状态的数据无疑可以表示为字典,因此如果您确实愿意,可以通过 pickle 强制它,例如通过copy_reg模块,它允许您为被迫非侵入性处理的对象自定义序列化/反序列化协议[[因此您不能四处添加__getstate__或类似的类]]——只有当这些对象之间存在丰富的相互引用网格时,问题才会出现)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我怎样才能得到泡菜泡沫结果? 的相关文章

随机推荐