首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >msgpack python自定义对象

msgpack python自定义对象
EN

Stack Overflow用户
提问于 2020-11-02 01:21:55
回答 1查看 176关注 0票数 1

我正在与另一个使用msgpack的系统通信。一直在尝试使用msgpack python包对自定义对象进行打包和解包。但是还没能做好。

消息是数组,结构如下:

代码语言:javascript
复制
[Header, Payload]

这里定义在一个我称为Message的类中。

[number, type]是一个长度为两个整数的数组。然而,Payload是一个具有整数键的映射。在Payload内部,也有带有整数键的映射。所以我可以有一个看起来像这样的负载:

代码语言:javascript
复制
{ 
  7: {8: 0.1}, 
  1: {1: 1.3}
}

我已经编写了一个方法来对这样的消息进行编码

代码语言:javascript
复制
def encode(obj):
    if isinstance(obj, Message):
        return [obj.header, obj.payload]
    elif isinstance(obj, Header):
        return [obj.number, obj.type]
    elif isinstance(obj, Payload):
        return obj.data

    raise ValueError(f"Wrong input for message. This object is given {obj}")

其中,Payload被定义为具有字典的类:

代码语言:javascript
复制
class Payload:
    def __init__(self) -> None:
        self.data = {}

我可以用以下代码对消息进行编码

代码语言:javascript
复制
message = Message()
packed = msgpack.packb(message, default=encode)

但我无法使用msgpack.unpackb解码它。根据我解码的简短文档,如下所示

代码语言:javascript
复制
unpacked = msgpack.unpackb(packed, object_hook=decode, strict_map_key=False)

我不知道的是如何才能正确地编写decode方法。如果我像这样定义一个decode函数:

代码语言:javascript
复制
def decode(packed_obj):
    print(f'decode called with {packed_obj}')

我得到了这个输出

代码语言:javascript
复制
decode called with {8: 0.1}
decode called with {1: 1.3}
decode called with {1: None, 7: None}

msgpack似乎是从调用最深的字典的方法开始,然后逐步递增。但我正在为如何重建Payload的对象而苦苦挣扎。

我认为我可以检查有效的键,如果值是一个浮点数,那么我知道这是内部的dict。但是decode函数最终应该返回一个Message类的对象。

我使用的是python3.6和msgpack 1.0.0,它与pip一起安装。

EN

回答 1

Stack Overflow用户

发布于 2020-11-30 03:59:23

在这里留下一个答案,以防后来有人谈到这个问题。解决方案是将解包和解码分开。基元类型被自动解包,不需要特殊的解码函数。

所以在这个例子中,这个字典可以直接编码和解码:

代码语言:javascript
复制
{ 
  7: {8: 0.1}, 
  1: {1: 1.3}
}

您需要的只是调用unpackb而不使用对象钩子函数。

代码语言:javascript
复制
unpacked = msgpack.unpackb(packed, strict_map_key=False)

然后,您可以编写一个函数来解码,该函数获取此字典并对其进行解码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64634748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档