2013-04-09 10 views
19

Sto provando a serializzare una struttura con protobuf. dopo molte ore cercando di capire quello che sto facendo male ho deciso di provare l'esempio del google e non ha funzionato cosìerrore con serializzazione con protobuf

ho il seguente protocollo da parte di 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 string name = 1; 
    required int32 id = 2; 
    optional string email = 3; 
    repeated PhoneNumber phone = 4; 

    enum PhoneType { 
     MOBILE = 0; 
     HOME = 1; 
     WORK = 2; 
    } 

    message PhoneNumber { 
     required string number = 1; 
     optional PhoneType type = 2 [default = HOME]; 
    } 
} 

message AddressBook { 
    repeated Person person = 1; 
} 

e sto cercando di serializzare con:

Person john = Person.newBuilder() 
    .setId(1234) 
    .setName("John Doe") 
    .setEmail("[email protected]") 
    .addPhone(
     Person.PhoneNumber.newBuilder() 
      .setNumber("555-4321") 
      .setType(Person.PhoneType.HOME)) 
    .build(); 

byte [] = serializzato john.toByteArray();

e ottengo "java.lang.UnsupportedOperationException: Questo deve essere sovrascritto dalle sottoclassi".

Grazie;

+1

Puoi pubblicare lo stacktrace completo? – rongenre

+5

Hai usato una versione di 'protoc' che corrisponde alla libreria che stai utilizzando? –

+2

Stavo usando diverse versioni di protobuf ... Grazie mille Marc! – Fynn

risposta

28

Come ha detto Marc, una mancata corrispondenza nelle versioni di Protocol Buffer ti darà questo messaggio esatto. In particolare, se

  • Il Proto definizione viene convertito in Java utilizzando il 2.4.3 (o precedente) protoc.exe
  • si utilizza la libreria 2.5.0 protobuffers

otterrete questo messaggio in molti metodi (ad es. getParserForType, getUnknownFields) della classe GeneratedMessage. Non ci sono senza dubbio altro potenziale mancata corrispondenza di che causerà questo errore


Con buffer di protocollo 2.5.0 è essenziale si rigenerare tutte le classi Java con la versione 2.5.0 di ProtoC (o su windows protoc.exe).


Se fate il contrario - il codice gestito generato da versione 2.5 ProtoC con le librerie per buffer protocollo versione 2.4. Riceverai il seguente messaggio

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

Ma ottengo questo messaggio anche protobuf e java lib sono 2.5.0 – Adelin

+0

@Adio hai generato la classe protobuf con 2.5.0. Questo messaggio si verifica quando la classe protobuf-java viene generata dalla definizione di .proto con una versione precedente di java. Aggiornerò la mia risposta per rendere più chiaro questo –

+7

Questo è un po 'sorprendente. Stavo pensando di utilizzare i buffer di protocollo per eliminare le dipendenze delle versioni e ora non ho nulla a che fare perché protoc è in Ubuntu della versione 2.4.1 e protobuf-java nel progetto ha la versione 2.5.0. Inoltre, il messaggio "Questo dovrebbe essere sovrascritto dalle sottoclassi" è davvero pessimo nel descrivere la vera ragione di un problema. – divanov