だから私はこれに少し困惑しています。最終的に Porotocol バッファ オブジェクトを文字列にシリアル化する C++ 側の AMQP クラスの実装があります。
qpid::messaging::message qmesg;
std::string msgstr;
ProtoMessage.SerializeToString(&msgstr);
qmesg.setContent(msgstr);
//Proceed to send the message
メッセージ本文はこれに設定され、コンテンツ タイプはバイナリです。
Java 側では、JMSBytesMessage オブジェクトからバイトを読み取り、データを解析してプロトコル バッファ オブジェクトに戻そうとします。
JMSBytesMessage msg; //Assume this is in the proper context
ProtoMessage.parseFrom(msg.getData().array());
私も試しました:
byte[] bytearr = new byte[]
msg.readBytes(bytearr);
どちらも同じです。
バイト データをログに記録すると、バイト値が表示されます (Array.ToString(byte[] を使用)) が、上記の Java 側のコードは InvalidProtocolBufferException をスローします。
com.google.protobuf.InvalidProtocolBufferException: Protocol message contained an invalid tag (zero).
バイトデータなので、文字エンコーディングに対して匿名であると思います。明らかな何かが欠けていますか?また、これがどれほどぎこちなく見えても、代替の実装の提案は控えてください。これを使用する必要があると仮定してください。任意のガイダンスをいただければ幸いです。
プロトコル バッファのバイト配列値 (不要かもしれませんが、なぜでしょうか) 編集: 異なるバイトの結果、興味深いです。
編集: Java でデコードされた上部、C++ でエンコードされた下部:
10 0 18 0 34 0 42 0 50 0 58 0 82 0 90 0 98 0 106 0 114 0 122 0 -126 1 6 97 99 99 101 112
10 0 18 0 34 0 42 0 50 0 58 0 82 0 90 0 98 0 106 0 114 0 122 0 130 1 6 97 99 99 101 112
これらは最初の数例にすぎませんが、パターンは続きます。ほとんどのデータは同じですが、一部のバイトが符号なしから符号付きに変更されています。私はあまり Java を使っていないので、ここで何が起こっているのでしょうか?