Protocole de message de la balise a invalid type de fil

mon application envoie des données par le biais de protobuf à partir d'un serveur à un client.
Quand je suis désérialisation de l'envoyé de la charge utile sur le côté client eclipse lance une exception de la follogwing type:

Exception in thread "main" com.google.protobuf.InvalidProtocolBufferException: Protocol message tag had invalid wire type.

L'attente qui se passe quand je l'appelle "parseFrom()". Je sais que dans la plupart des cas, l'erreur se trouve dans une protobuf fichier avec la mauvaise syntaxe. Donc j'espère qu'il suffit de poster le protobuf définition ici:

   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;
    }

voici le code qui montre comment les données sont écrites sur le côté serveur:

//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;

Comme vous pouvez le voir, le Serveur utilise le Générateur de modèle fourni par protobuf les cordes. Ensuite, les données sont sérialisées comme un byte[] et est envoyé au client par l'intermédiaire de protobuf.

Voici le code du client, où j'essaie d'analyser les données.

HttpEntity entity = response.getEntity();

    if (entity != null) {
        InputStream instream = entity.getContent();
        CAR car = DesktopDevice_getCarsResponse.CARS.parseFrom(instream);
        }

L'exception est levée lors de l' .parseFrom est appelé. Le serveur de code et carObj fonctionnent très bien. J'ai déjà réussi à envoyer protobuf données dans mon programme.

  • Qu'est-ce que avez à faire avec le RESTE?
  • Je suis également en utilisant REPOS dans ma demande, mais c'est pas lié à mon problème ici. Enlevé l'étiquette
  • Comment avez-vous écrire ces données, exactement? a l'aide du même outil et de la même .proto définition? Aussi: comment avez-vous physiquement le faire l'écriture? par exemple, une erreur fréquente consiste à mettre en mémoire tampon et d'utiliser ensuite la très grande partie de la mémoire tampon (plutôt que seulement la partie de la mémoire tampon avec de véritables protobuf des données qu'il contient). Je pense que nous avons besoin de voir le code qui gère la lecture et de l'écriture, plus que nous avons besoin de voir la .proto...
  • édité mon post initial avec le codage sur la façon dont les données sont écrites sur le serveur et côté client. La Communication entre le serveur et le client fonctionne via la sérialisation comme byte[] (successfullytested avec un autre protobuf fichier) et carObj fournit des Chaînes valides pour la protobuf-builder
InformationsquelleAutor RCK69 | 2012-10-15