2

两个 uService 通过消息队列 (RabbitMQ) 进行通信。数据使用message pack进行编码。

我有以下场景:

  • python3-> python3:工作正常
  • python2 -> python3:编码问题

编码通过以下方式完成:

umsgpack.packb(data)

解码:

umsgpack.unpackb(body)

在 python3 中进行编码和解码时,我得到:

data={'sender': 'producer-big-red-tiger', 'json': '{"msg": "hi"}', 'servicename': 'echo', 'command': 'run'}

在 python2 中进行编码并在 python3 上进行解码时,我得到:

data={b'command': b'run', b'json': b'{"msg": ""}', b'servicename': b'echo', b'sender': b'bla-blah'}

为什么数据没有“完全”解码?在发送方/接收方上应该怎么做才能实现python2和python3的兼容?

4

1 回答 1

2

查看来自msgpack-python的 README 的“注释”部分;

msgpack 目前可以区分字符串和二进制类型。但它不像 Python 2。Python 2 添加了 unicode 字符串。但是 msgpack 将 raw 重命名为 str 并添加了 bin 类型。这是因为保持与旧库创建的数据的兼容性。raw 用于文本而不是二进制。

目前,虽然 msgpack-python 支持新的 bin 类型,但默认设置不使用它并将 raw 解码为字节而不是 unicode(Python 3 中的 str)。

您可以通过使用 Packer 中的 use_bin_type=True 选项和 Unpacker 中的 encoding="utf-8" 选项来更改此设置。

>>> import msgpack
>>> packed = msgpack.packb([b'spam', u'egg'], use_bin_type=True)
>>> msgpack.unpackb(packed, encoding='utf-8')
['spam', u'egg']
于 2016-04-20T07:21:10.917 回答