我正在与另一个使用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一起安装
在这里留下一个答案,以防以后有人知道。 解决方案是将解包与解码分开。 原语类型自动解包,无需特殊解码功能
因此,在本例中,该词典可以直接编码&;解码:
您需要的是在没有对象钩子函数的情况下调用
unpackb
然后,您可以编写一个函数进行解码,该函数将获取此附加值并对其进行解码
相关问题 更多 >
编程相关推荐