【发布时间】:2020-11-01 17:21:55
【问题描述】:
我正在与另一个使用 msgpack 的系统进行通信。 一直在尝试使用 msgpack python 包打包和解包自定义对象。但是一直没做好。
消息是数组,结构如下:
[Header, Payload]
这里定义在一个我称之为Message的类中。
标头是一个长度为两个整数[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}")
其中 Payload 被定义为带有字典的类:
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 的对象。
我认为我可以通过有效键,如果值是浮点数,那么我知道这是内部字典。但是解码函数最终应该返回一个Message类的对象。
我使用的是 python 3.6 和 msgpack 1.0.0,它是通过 pip 安装的。
【问题讨论】:
标签: python python-3.x msgpack