私のアプリケーションは、protobuf を介してサーバーからクライアントにデータを送信します。クライアント側のEclipseで送信されたペイロードを逆シリアル化すると、次のタイプの期待がスローされます。
Exception in thread "main" com.google.protobuf.InvalidProtocolBufferException: Protocol message tag had invalid wire type.
「parseFrom()」を呼び出すと、期待が生じます。ほとんどの場合、エラーは間違った構文の protobuf ファイルにあることがわかっています。したがって、protobuf の定義をここに投稿するだけで十分だと思います。
package protobuf;
option java_package = "com.carproject.abs.demo.protobuf";
option java_outer_classname = "DesktopDevice_getCarsResponse";
message CARS {
required int64 carid = 1;
required string carname = 2;
message Carinformation {
required string street = 1;
required string postalcode = 2;
required string city = 3;
required string country = 4;
required string cartimezoneid = 5;
}
message Right {
optional string name = 1;
optional int32 type = 2;
optional int32 service = 3;
}
message PropertyType {
optional string name = 1;
optional string value = 2;
}
repeated Carinformation carinformation = 3;
repeated Right carrights = 4;
repeated PropertyType carproperties = 5;
repeated string inoid = 6;
}
サーバー側でデータがどのように書き込まれるかを示すコードは次のとおりです。
// carObj returns the necessary Strings
CAR carObj = car.getCAR();
Builder newBuilder = DesktopDevice_getCarResponse.CAR.newBuilder();
newBuilder.setCarid( carObj.getCARID() );
newBuilder.setCarname( carObj.getCARNAME());
// hardcoded values here
newBuilder.getCarinformationBuilder(1).setStreet( carObj.getCARNFORMATION().getSTREET() );
newBuilder.getCarinformationBuilder(1).setPostalcode( carObj.getCARINFORMATION().getPOSTALCODE() );
newBuilder.getCarinformationBuilder(1).setCity( carObj.getCARINFORMATION().getCITY() );
newBuilder.getCarinformationBuilder(1).setCountry( fleetObj.getCARINFORMATION().getCOUNTRY() );
newBuilder.getCarinformationBuilder(1).setCartimezoneid( fleetObj.getCARINFORMATION().getCARTIMEZONEID() );
byte[] responsePayload = newBuilder.build().toByteArray();
RestServerResponseMessage responseMsg = new RestServerResponseMessage( requestMsg.getRequestId(), responsePayload, "XML");
return responseMsg;
ご覧のとおり、サーバーは protobuf によって提供される Builder パターンを使用して、必要な文字列を設定します。次に、データは byte[] としてシリアル化され、protobuf を介してクライアントに送り返されます。
これは、データを解析しようとするクライアント コードです。
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
CAR car = DesktopDevice_getCarsResponse.CARS.parseFrom(instream);
}
.parseFrom が呼び出されると、例外がスローされます。サーバー コードと carObj は正常に動作しています。プログラムでprotobufデータをすでに正常に送信しています。