erreur avec la sérialisation avec protobuf

J’essaie de sérialiser une structure avec protobuf. après de nombreuses heures à essayer de comprendre ce que je fais mal, j’ai décidé de tester l’exemple de Google et cela n’a pas fonctionné aussi bien

J’ai le protocole suivant de google ( https://developers.google.com/protocol-buffers/docs/javatutorial ):

package tutorial; option java_package = "com.example.tutorial"; option java_outer_classname = "AddressBookProtos"; message Person { required ssortingng name = 1; required int32 id = 2; optional ssortingng email = 3; repeated PhoneNumber phone = 4; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required ssortingng number = 1; optional PhoneType type = 2 [default = HOME]; } } message AddressBook { repeated Person person = 1; } 

et j’essaye de le sérialiser avec:

 Person john = Person.newBuilder() .setId(1234) .setName("John Doe") .setEmail("jdoe@example.com") .addPhone( Person.PhoneNumber.newBuilder() .setNumber("555-4321") .setType(Person.PhoneType.HOME)) .build(); 

byte [] serialized = john.toByteArray ();

et j’obtiens “java.lang.UnsupportedOperationException: cela est censé être remplacé par des sous-classes.”

Merci;

    Comme Marc l’a dit, une disparité dans les versions du tampon de protocole vous donnera ce message exact. En particulier si

    • La définition .proto est convertie en java à l’aide du protocole 2.4.4 (ou antérieur)
    • Vous utilisez la bibliothèque de prototypes 2.5.0

    vous obtiendrez ce message dans de nombreuses méthodes (par exemple, getParserForType, getUnknownFields) de la classe GeneratedMessage . Il existe sans aucun doute d’autres incompatibilités potentielles pouvant entraîner cette erreur.


    Avec les tampons de protocole 2.5.0, il est essentiel de régénérer toutes les classes java avec la version 2.5.0 du protocole (ou sous windows protoc.exe).


    Si vous utilisez le code d’exécution inversée généré par la version 2.5 du protocole avec les bibliothèques pour la version 2.4 des tampons de protocole . Vous recevrez le message suivant

     java.lang.VerifyError: class xxx.xxx.xx.. overrides final method getUnknownFields.()Lcom/google/protobuf/UnknownFieldSet;