Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
msgpack python自定义对象_Python_Python 3.x_Msgpack - Fatal编程技术网

msgpack python自定义对象

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

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

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

[标题,有效负载]
这里定义在一个类中,我称之为
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)
然后,您可以编写一个函数进行解码,该函数将获取此附加值并对其进行解码