msgpack python自定义对象
我正在与另一个使用msgpack的系统通信。 一直在尝试使用msgpackpython包打包和解包自定义对象。但我没能把它做好 作为数组的消息的结构如下所示:msgpack python自定义对象,python,python-3.x,msgpack,Python,Python 3.x,Msgpack,我正在与另一个使用msgpack的系统通信。 一直在尝试使用msgpackpython包打包和解包自定义对象。但我没能把它做好 作为数组的消息的结构如下所示: [标题,有效负载] 这里定义在一个类中,我称之为Message 标头是长度为两个整数的数组[数字,类型]。 Payload不过是一个带有整数键的映射。在Payload中,还有带有整数键的映射。 所以我可以得到一个如下所示的有效载荷: { 7: {8: 0.1}, 1: {1: 1.3} } 我已经写了一个方法来编码这样的消息 def
[标题,有效负载]
这里定义在一个类中,我称之为Message
标头是长度为两个整数的数组[数字,类型]
。
Payload
不过是一个带有整数键的映射。在Payload
中,还有带有整数键的映射。
所以我可以得到一个如下所示的有效载荷:
{
7: {8: 0.1},
1: {1: 1.3}
}
我已经写了一个方法来编码这样的消息
def编码(obj):
如果存在(obj,信息):
返回[目标头,目标有效载荷]
elif isinstance(对象、标题):
返回[对象编号,对象类型]
elif isinstance(obj,有效载荷):
返回对象数据
raise VALUERROR(f“消息输入错误。此对象被赋予{obj}”)
其中,有效负载定义为具有字典的类:
类有效载荷:
定义初始化(自)->无:
self.data={}
我可以用
message=message()
packed=msgpack.packb(消息,默认值=encode)
但我无法使用msgpack.unpacb
对其进行解码。根据简短的文档,我这样解码
unpacket=msgpack.unpackb(打包,对象钩子=解码,严格映射\u键=假)
我不知道的是如何正确地编写解码方法。
如果我像这样定义解码函数:
def解码(压缩对象):
打印(用{packed_obj}调用f'decode)
我得到这个输出
decode called with {8: 0.1}
decode called with {1: 1.3}
decode called with {1: None, 7: None}
msgpack似乎从调用最深字典的方法开始,然后逐步向上。
但是我正在努力重建一个有效载荷的对象
我想我可以通过有效键,如果值是浮点,那么我知道这是内部dict。但是decode函数最终应该返回类Message
的对象
我使用的是Python3.6和msgpack 1.0.0,它与pip一起安装。在这里留下一个答案,以防以后有人看到这个问题。
解决方案是将解包与解码分开。
原语类型自动解包,无需特殊解码功能
因此,在本例中,该词典可以直接编码和解码:
{
7: {8: 0.1},
1: {1: 1.3}
}
您只需调用unpacb
,而无需对象挂钩函数
unpacket=msgpack.unpackb(打包,严格映射密钥=False)
然后,您可以编写一个函数进行解码,以获取此附加项并对其进行解码。在此处留下答案,以防以后有人获取此附加项。
解决方案是将解包与解码分开。
原语类型自动解包,无需特殊解码功能
因此,在本例中,该词典可以直接编码和解码:
{
7: {8: 0.1},
1: {1: 1.3}
}
您只需调用unpacb
,而无需对象挂钩函数
unpacket=msgpack.unpackb(打包,严格映射密钥=False)
然后,您可以编写一个函数进行解码,该函数将获取此附加值并对其进行解码