错误与protobuf的系列化(error with serialization with prot

2019-08-21 01:02发布

我试图序列化结构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:这应该由子类覆盖。”

谢谢;

Answer 1:

正如马克说,在协议缓存版本的不匹配会给你这个确切的消息。 尤其是,如果

  • 所述.proto定义被转换为使用2.4.3 Java(或更早)protoc.exe
  • 您可以使用2.5.0 protobuffers库

你会得到一流GeneratedMessage的许多方法(如getParserForType,getUnknownFields)此消息。 有没有疑问,其他潜在的不匹配的,这将导致此错误


随着协议缓冲区2.5.0 重新生成所有Java类与2.5.0版本protoc的(或在Windows protoc.exe)它是必不可少的


如果你做反向-通过protoc 2.5版协议库生成的代码运行缓存版本2.4。 您会收到以下消息

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


文章来源: error with serialization with protobuf