在 python 中序列化 suds 对象
好吧,我正在努力更好地使用 python,所以我不确定这是开始我正在做的事情的正确方法,但这是我当前的问题......
我需要通过获取一些信息SOAP方法,现在只使用部分信息,但存储整个结果以供将来使用(我们需要尽可能少地使用该服务)。寻找访问该服务的最佳方式,我认为泡沫是最好的方式,而且它很简单,并且可以像魅力一样获取数据。但现在我想以某种方式保存结果,最好是序列化/保存在数据库中,这样我就可以稍后将其取出并使用它。
执行此操作的最佳方法是什么,看起来 pickle/json 不是一个选项?谢谢!
更新 阅读 How can I pickle suds results? 上的最佳答案给了我更好的答案为什么这不是一个选择,我想我一直在用我需要的信息重新创建一个基本对象?
Ok I'm working on getting better with python, so I'm not sure this is the right way to go about what I'm doing to begin with, but here's my current problem...
I need to get some information via a SOAP method, and only use part of the information now but store the entire result for future uses (we need to use the service as little as possible). Looking up the best way to access the service I figured suds was the way to go, and it was simple and worked like a charm to get the data. But now I want to save the result somehow, preferably serialized / in a database so I can pull it out later and use it the same.
What's the best way to do this, it looks like pickle/json isn't an option? Thanks!
Update
Reading the top answer at How can I pickle suds results? gives me a better idea of why this isn't an option, I guess I'm stuck recreating a basic object w/ the information I need?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
我一直在使用以下方法将 Suds 对象转换为 JSON:
I have been using following approach to convert Suds object into JSON:
是的,我确认我在您提到的答案中给出的解释 - 动态生成的类不容易picklable(也不容易序列化),您需要提取所有状态信息,pickle that状态,如果你真的坚持使用它,并在检索时重建棘手的 sudsobject;-)。
Yep, I confirm the explanation I gave in the answer you refer to -- dynamically generated classes are not easily picklable (nor otherwise easily serializable), you need to extract all the state information, pickle that state, and reconstruct the tricky sudsobject on retrieval if you really insist on using it;-).
这是我在研究和找到这个答案之前想到的。这实际上对我来说在复杂的肥皂水响应以及其他对象(例如 __builtins__)上效果很好,因为该解决方案与肥皂水无关:
该解决方案有效并且实际上更快。它也适用于没有
__keylist__
属性的对象。我在复杂的泡沫输出对象上运行基准测试 100 次,该解决方案的运行时间为 0.04 到 0.052 秒(平均值为 0.045724287)。而上面的
recursive_asdict
解决方案的运行时间为 0.082 到 0.102 秒,几乎翻倍(平均值为 0.0829765582)。然后我回到绘图板并重新完成该函数以获得更多性能,并且它不需要
datetime
导入。我利用了__keylist__
属性,因此这不适用于其他对象,例如__builtins__
但对于 suds 对象输出效果很好:运行时间为 0.18 - 0.033 秒( 0.0260889721 平均值),比
recursive_asdict
解决方案快了近 4 倍。Here is what I came up with before researching and finding this answer. This actually works well for me on complex suds responses and also on other objects such as
__builtins__
since the solution is suds agnostic:This solution works and is actually faster. It also works on objects that don't have the
__keylist__
attribute.I ran a benchmark 100 times on a complex suds output object, this solutions run time was 0.04 to .052 seconds (0.045724287 average). While
recursive_asdict
solution above ran in .082 to 0.102 seconds so nearly double (0.0829765582 average).I then went back to the drawing board and re-did the function to get more performance out of it, and it does not need the
datetime
import. I leveraged in using the__keylist__
attribute, so this will not work on other objects such as__builtins__
but works nicely for suds object output:The run time was 0.18 - 0.033 seconds (0.0260889721 average), so nearly 4x as faster than the
recursive_asdict
solution.我为 suds 的对象实例实现了一个虚拟类,然后能够序列化。 FakeSudsInstance 的行为类似于原始 Suds 对象实例,请参见下文:
现在,在 suds 调用之后,例如如下:
我希望它有所帮助。
I made an implementation of a dummy class for Object intance of suds, and then being able to serialize. The FakeSudsInstance behaves like an original Suds Object instance, see below:
Now, after a suds call, for example below:
I hope it helps.
上面建议的解决方案会丢失有关类名的宝贵信息 - 它在 DFP 客户端等某些库中可能很有价值 https://github.com/googleads/googleads-python-lib,其中实体类型可能以动态生成的类名称进行编码(即 TemplateCreative/ImageCreative)
这是我使用的解决方案,它保留类名并恢复字典序列化对象而不会丢失数据(除了 suds.sax.text.Text ,它将被转换为常规 unicode 对象,也许还有一些我没有的其他类型遇到)
The solutions suggesed above lose valuable information about class names - it can be of value in some libraries like DFP client https://github.com/googleads/googleads-python-lib where entity types might be encoded in dynamically generated class names (i.e. TemplateCreative/ImageCreative)
Here's the solution I used that preserves class names and restores dict-serialized objects without data loss (except suds.sax.text.Text which would be converted into regular unicode objects and maybe some other types I haven't run into)
我更新了上面的
recursive_asdict
示例 与 python3 兼容(items
而不是iteritems
)。I updated the
recursive_asdict
example above to be compatible with python3 (items
instead ofiteritems
).我喜欢这样。我们自己不进行迭代,是python在转换为字符串时进行迭代
I like this way. We don't do the iteration ourselves, it is python that iterates when converting it to string