使用protobuf序列化时出错

我正在尝试使用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("jdoe@example.com") .addPhone( Person.PhoneNumber.newBuilder() .setNumber("555-4321") .setType(Person.PhoneType.HOME)) .build(); 

byte [] serialized = john.toByteArray();

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

谢谢;

正如Marc所说,协议缓冲区版本中的不匹配将为您提供此确切消息。 特别是如果

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

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


使用协议缓冲区2.5.0必须使用2.5.0版本的protoc(或在windows protoc.exe上) 重新生成所有java类。


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

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