我正在与另一个使用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方法。如果我像这样定义一个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一起安装。
发布于 2020-11-30 03:59:23
在这里留下一个答案,以防后来有人谈到这个问题。解决方案是将解包和解码分开。基元类型被自动解包,不需要特殊的解码函数。
所以在这个例子中,这个字典可以直接编码和解码:
{
7: {8: 0.1},
1: {1: 1.3}
}您需要的只是调用unpackb而不使用对象钩子函数。
unpacked = msgpack.unpackb(packed, strict_map_key=False)然后,您可以编写一个函数来解码,该函数获取此字典并对其进行解码。
https://stackoverflow.com/questions/64634748
复制相似问题