Подтвердить что ты не робот

Ошибка с сериализацией с protobuf

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

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

byte [] serialized = john.toByteArray();

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

Спасибо

4b9b3361

Ответ 1

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

  • Определение .proto преобразуется в java с использованием файла protoc.exe версии 2.4.3 (или более раннего)
  • Вы используете 2.5.0 protobuffers library

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


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


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

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