【问题标题】:python - is it possible to extend the set of things that xml-rpc can serialize?python - 是否可以扩展 xml-rpc 可以序列化的东西集?
【发布时间】:2014-04-30 23:31:50
【问题描述】:

我看到几个问题询问如何通过 xml-rpc 调用发送numpy.ndarray。这不能开箱即用,因为正如 xml-rpc docs 所述,有一组固定的受支持类型,基本上仅限于内置插件和内置插件容器。

一个简单的解决方案是将numpy数组转换为列表使用

<array to send>.tolist()

在发送端,并使用

转换回numpy数组

np.array(<list I received>)

在接收方。但是,假设我希望能够直接支持ndarray,而无需显式展平/取消展平。有没有我可以实现的接口来完成这项工作?例如,我可以扩展ndarray(我知道这很棘手)与某些将使用 xml-rpc 注册并因此用于序列化/反序列化的扁平化/非扁平化方法吗?

【问题讨论】:

    标签: python xml-rpc


    【解决方案1】:

    我不认为有任何扩展的钩子。

    您可以对对象进行编码/取消编码,而不是展平/取消展平,例如使用 pickle 或 base64 编码的 pickle。

    如果您确实需要扁平化,请记住:

    <array>.shape
    <array>.dtype
    <array>.flat
    

    简单的dtypes可以来回转换为字符串;如果您想支持复杂的数据类型,您可能需要更仔细地考虑它们。

    [编辑] 简洁地回答您的问题:否 - 没有可用的扩展挂钩。

    【讨论】:

    • 当然,我们总是可以将数组分解为可管理的部分。但是,一旦我们这样做了,我们怎么可能告诉 xml-rpc 将这些部分解压缩到接收端的适当 ndarray 中?我的意思是,我总是可以通过网络发送一个 (myArray.tostring(), myArray.shape, myArray.dtype) 元组,但接收者不知道如何处理它。
    • 一种看待它的方式是——即使有扩展挂钩,它们也必须安装在两端。似乎您需要编写包装器而不是钩子,它们在两端都有一个关于如何注释原始对象的通用约定。一种简单的方法是所有二进制对象实际上都是泡菜:如果两端都知道这一点,您仍然无法发送所有内容(例如,不是绑定方法......除非您扩展泡菜 - 但这里有钩子)但是你应该可以发送大部分东西。
    • 是的。但问题是,如果我们要做包装器,至少对于 ndarray,我们还不如做我在问题中提到的 .tolist() 和 array() 。我同意可以编写一个通用的扁平化/非扁平化包装器来处理更多类型。
    • base64 表示会更加紧凑...确实,如果您真的想要紧凑,请查看blosc。或者,如果您想要可读,那么 toList() 可能没问题(尽管如果您不保存字符串或结构化 dtype 可能会导致问题)。
    • 我的问题的重点是扩展钩子是否存在,我猜答案是否存在。它是包装器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多