1

クライアントは1481バイトの配列を送信します。サーバーは問題なくすべての1481バイトのメッセージを読み取ることができますが、受信したバイナリ配列から指定されたメッセージを解析することにより、次の例外が発生します。

com.google.protobuf.InvalidProtocolBufferException: Protocol message contained an invalid tag (zero).

バイナリデータは同じです。正しいバージョンのprotoファイルを使用していることを確認しました。私は少し途方に暮れています。助けていただければ幸いです。

コード

byte [] data= IOUtils.toByteArray(br1, "ASCII"); System.out.println("SIZE:" + data.length);
AddressBook adb1 = AddressBook.parseFrom(data); System.out.println("Server: Addressbook:" + adb1.getPersonCount()); System.out.println("Server: Addressbook:" + adb1.getPerson(0).getName());

質問:

読み取った1481バイトのarryから受信したAdressbookmsgを正しく解析する方法を見つける必要があります。

ありがとう。

4

2 に答える 2

2

これが問題です:

br1 = new InputStreamReader(s.getInputStream());

これは、不透明なバイナリデータをテキストとして処理しようとしています。テキストではなく、バイナリデータです。したがって、これをReaderバイト配列に変換すると、元のデータの負荷が失われます。これが無効なプロトコルバッファであることは不思議ではありません。

使用するだけです:

AddressBook adb1 = AddressBook.parseFrom(s.getInputStream());

不可逆テキスト変換を回避します。もちろん、C#側で同じように壊れたものがないことを前提としています。

テキストを使用する必要がある場合は、両側でbase64エンコーディングを使用する必要があります。

于 2012-10-31T20:00:11.927 に答える
0

これで動作します。ProtocolBuffersメッセージをシリアル化して送信すること同じ間違いを犯しました

于 2012-11-06T19:14:07.363 に答える