20

我正在尝试使用 protobuf 序列化结构。经过几个小时试图找出我做错了什么后,我决定测试谷歌的示例,但效果不佳

我有来自谷歌的以下协议(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("jdoe@example.com")
    .addPhone(
        Person.PhoneNumber.newBuilder()
            .setNumber("555-4321")
            .setType(Person.PhoneType.HOME))
    .build();

字节[] 序列化 = john.toByteArray();

我得到“java.lang.UnsupportedOperationException:这应该被子类覆盖”。

谢谢;

4

1 回答 1

29

正如 Marc 所说,Protocol Buffer 版本不匹配会给你这个确切的信息。特别是如果

  • 使用 2.4.3(或更早版本)protoc.exe 将 .proto 定义转换为 java
  • 您使用 2.5.0 protobuffers 库

您将在GeneratedMessage类的许多方法(例如 getParserForType、getUnknownFields)中收到此消息。毫无疑问,其他潜在的不匹配会导致此错误


使用protocol buffers 2.5.0,您必须使用2.5.0 版本的protoc(或windows protoc.exe)重新生成所有java 类。


如果您使用2.4 版协议缓冲区的库执行protoc 2.5 版生成的反向运行代码。您将收到以下消息

java.lang.VerifyError: class xxx.xxx.xx.. 
overrides final method getUnknownFields.()Lcom/google/protobuf/UnknownFieldSet;
于 2013-04-09T22:05:27.287 回答