两个uServices通过消息队列(RabbitMQ)进行通信。数据使用消息包进行编码。
我有以下场景:
- 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之间的兼容性?
看看"Notes";msgpack python的自述部分;
msgpack目前可以区分字符串和二进制类型。但它与Python 2不同。Python 2添加了unicode字符串。但msgpack将raw重命名为str,并添加了bin类型。这是因为要保持与旧库创建的数据的兼容性。raw用于文本而非二进制。
目前,虽然msgpack-python支持新的bin类型,但默认设置不使用它,而是将原始解码为字节,而不是unicode(python 3中的str)。
您可以使用Packer中的use_bin_type=True选项和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']