2013-04-09 3 views
19

Я пытаюсь сериализовать структуру с protobuf. после многих часов, пытаясь выяснить, что я делаю неправильно, я решил проверить примеру Google и он не работал, аошибка с сериализацией с protobuf

У меня есть следующий протокол от 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; 
} 

и я пытаюсь сериализации его:

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

байт [] = сериализовать john.toByteArray();

и я получаю «java.lang.UnsupportedOperationException: это должно быть переопределено подклассами».

Thanks;

+1

Можете ли вы опубликовать полный стек? – rongenre

+5

Вы использовали версию 'protoc', которая соответствовала библиотеке, которую вы используете? –

+2

Я использовал разные версии protobuf ... Большое спасибо Marc! – Fynn

ответ

28

Как сказал Марк, несоответствие в версиях протокола протокола даст вам это точное сообщение. В частности, если

  • .proto определение преобразуется в Java, используя 2.4.3 (или выше) protoc.exe
  • Вы можете использовать библиотеку 2.5.0 protobuffers

вы получите это сообщение во многих методах (например, getParserForType, getUnknownFields) класса GeneratedMessage. Там нет сомнений, других потенциальных несоответствий в том, что будет вызывать эту ошибку


С буферами протокола 2.5.0 это важно вы регенерировать всех классы Java с версией protoc 2.5.0 (или windows protoc.exe).


Если сделать наоборот - запустить код, сгенерированный protoc версии 2.5 с библиотеками для протокола буферов версии 2.4. Вы получите следующее сообщение:

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

Но я получаю это сообщение даже protobuf, а java lib - 2.5.0 – Adelin

+0

@Adio вы создали protobuf класс с 2.5.0. Это сообщение возникает, когда класс protobuf-java генерируется из определения .proto с предыдущей версией java. Я уточню свой ответ, чтобы сделать это более ясным. –

+7

Это своего рода удивительный. Я планировал использовать протокольные буферы для устранения зависимостей версий, и теперь у меня нет ничего работающего, потому что protoc находится в Ubuntu версии 2.4.1, а protobuf-java в проекте имеет версию 2.5.0. Плюс сообщение «Это должно быть переопределено подклассами» на самом деле паршиво описывает реальную причину проблемы. – divanov

Смежные вопросы