msgpack python自定义对象

2024-05-13 11:18:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

作为数组的消息的结构如下所示:

[Header, Payload]

这里是在我调用的Message类中定义的

Header是长度为两个整数的数组[number, type]Payload然而,它是一个具有整数键的映射。在Payload内部还有带有整数键的映射。 所以我可以得到一个如下所示的有效载荷:

{ 
  7: {8: 0.1}, 
  1: {1: 1.3}
}

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

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}")

其中,有效负载定义为具有字典的类:

class Payload:
    def __init__(self) -> None:
        self.data = {}

我可以用

message = Message()
packed = msgpack.packb(message, default=encode)

但是我无法用msgpack.unpackb来解码它。根据简短的文档,我这样解码

unpacked = msgpack.unpackb(packed, object_hook=decode, strict_map_key=False)

我不知道的是如何正确地编写解码方法。 如果我这样定义decode函数:

def decode(packed_obj):
    print(f'decode called with {packed_obj}')

我得到这个输出

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一起安装


Tags: 对象方法objmessage定义defwith整数
1条回答
网友
1楼 · 发布于 2024-05-13 11:18:15

在这里留下一个答案,以防以后有人知道。 解决方案是将解包与解码分开。 原语类型自动解包,无需特殊解码功能

因此,在本例中,该词典可以直接编码&;解码:

{ 
  7: {8: 0.1}, 
  1: {1: 1.3}
}

您需要的是在没有对象钩子函数的情况下调用unpackb

unpacked = msgpack.unpackb(packed, strict_map_key=False)

然后,您可以编写一个函数进行解码,该函数将获取此附加值并对其进行解码

相关问题 更多 >