2013-04-09 4 views
19

Próbuję serializować strukturę z protobuf. po wiele godzin próbuje dowiedzieć się, co robię źle postanowiłem przetestować przykład Google i nie pracował jak dobrzebłąd z serializacją z protobuf

Mam następujący protokół z 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; 
} 

i staram się szeregować je:

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 [] w odcinkach = john.toByteArray();

i otrzymuję "java.lang.UnsupportedOperationException: ma to być nadpisane przez podklasy."

Dzięki;

+1

Czy możesz opublikować kompletny stacktrace? – rongenre

+5

Czy użyłeś wersji 'protoc', która pasowała do używanej biblioteki? –

+2

Używałem różnych wersji protobuf ... Wielkie dzięki, Marc! – Fynn

Odpowiedz

28

Zgodnie z tym, co powiedział Marc, niedopasowanie w wersjach z protokołem buforowania daje dokładnie tę wiadomość. W szczególności jeśli

  • .proto definicja jest przekształcany w Java z wykorzystaniem 2.4.3 (lub wcześniej) protoc.exe
  • użyć biblioteki 2.5.0 protobuffers

dostaniesz to wiadomość w wielu metodach (np. getParserForType, getUnknownFields) klasy GeneratedMessage. Nie ma wątpliwości, inne potencjalne niedopasowanie, że spowoduje to błąd


Z protokołu buforów 2.5.0 jest niezbędnezregenerować wszystkich klas Javy z wersją protoc 2.5.0 (lub na windows protoc.exe).


Jeśli zrobisz odwrotnie - uruchomić kod generowany przez wersji protoc 2,5 z biblioteki do protokołu buforuje wersji 2.4. Otrzymasz następujący komunikat:

+0

Ale otrzymuję tę wiadomość nawet protobuf i java lib są 2.5.0 – Adelin

+0

@ Adio czy wygenerowałeś klasę protobuf z 2.5.0. Ten komunikat pojawia się, gdy klasa protobuf-java jest generowana z definicji .proto przy użyciu wcześniejszej wersji java. Zaktualizuję moją odpowiedź, aby uczynić jaśniejszym –

+7

To jest niesamowite. Planowałem użyć buforów protokołów w celu wyeliminowania zależności wersji i teraz nie mam nic do roboty, ponieważ protoc jest w Ubuntu wersji 2.4.1, a protobuf-java w projekcie ma wersję 2.5.0. Komunikat plus "To powinno zostać przesłonięte przez podklasy" jest naprawdę kiepski w opisywaniu prawdziwego powodu problemu. – divanov