【问题标题】:msgpack python custom objectsmsgpack python 自定义对象
【发布时间】: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


    【解决方案1】:

    在此处留下答案,以防以后有人遇到此问题。 解决方案是将解包与解码分开。 原始类型会自动解包,无需特殊的解码功能。

    所以在例子中,这个字典可以直接编码和解码:

    { 
      7: {8: 0.1}, 
      1: {1: 1.3}
    }
    

    您需要的只是调用unpackb 而不使用对象挂钩函数。

    unpacked = msgpack.unpackb(packed, strict_map_key=False)
    

    然后您可以编写一个函数来解码,获取该字典并对其进行解码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 2022-01-22
      • 2017-12-04
      • 1970-01-01
      相关资源
      最近更新 更多