2

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 タイプをサポートしていますが、デフォルト設定ではそれを使用せず、Unicode (Python 3 では str) の代わりに raw をバイトとしてデコードします。

これは、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 に答える