两个uServices正在通过消息队列(RabbitMQ)进行通信。数据使用message pack进行编码。
我有以下情况:
编码完成:
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之间的兼容性?
答案 0 :(得分:2)
看看" Notes"来自msgpack-python的自述文件部分;
msgpack现在可以区分字符串和二进制类型。但它不像Python 2. Python 2添加了unicode字符串。但是msgpack将raw重命名为str并添加了bin类型。这是因为保持与旧库创建的数据的兼容性。 raw用于文本而不是二进制文件。
目前,虽然msgpack-python支持新的bin类型,但默认设置并不使用它并将raw解码为字节而不是unicode(在Python 3中为str)。
您可以在Packer中使用use_bin_type = True选项并编码=" utf-8"解包器中的选项。
>>> import msgpack
>>> packed = msgpack.packb([b'spam', u'egg'], use_bin_type=True)
>>> msgpack.unpackb(packed, encoding='utf-8')
['spam', u'egg']