使用protobuf进行序列化时出错

时间:2013-04-09 17:15:13

标签: java serialization protocol-buffers

我正在尝试使用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();
  

byte [] serialized = john.toByteArray();

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

感谢;

1 个答案:

答案 0 :(得分:28)

正如Marc所说,协议缓冲区版本中的不匹配会给你这个确切的消息。特别是如果

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

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


使用协议缓冲区2.5.0 必不可少 重新生成所有具有2.5.0版protoc的java类(或在Windows上) protoc.exe)。


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

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