【问题标题】:error with serialization with protobufprotobuf 序列化错误
【发布时间】:2013-04-09 17:15:13
【问题描述】:

我正在尝试使用 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[] 序列化 = john.toByteArray();

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

谢谢;

【问题讨论】:

  • 你能发布完整的堆栈跟踪吗?
  • 您是否使用了与您正在使用的库匹配的protoc 版本?
  • 我使用了不同版本的 protobuf...非常感谢 Marc!

标签: java serialization protocol-buffers


【解决方案1】:

正如 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 上)的 java 类protoc.exe)。


如果您使用 protocol buffers version 2.4 的库执行反向操作,则运行由 protoc version 2.5 生成的代码。您将收到以下消息

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

【讨论】:

  • 但我收到这条消息,即使 protobuf 和 java lib 是 2.5.0
  • @Adio 你用 2.5.0 生成了 protobuf 类吗?当 protobuf-java 类是从具有早期版本的 java 的 .proto 定义生成时,会出现此消息。我将更新我的答案以使其更清楚
  • 这太神奇了。我计划使用协议缓冲区来消除版本依赖关系,现在我没有任何工作,因为 protoc 在 Ubuntu 版本 2.4.1 中,而项目中的 protobuf-java 版本为 2.5.0。加号消息“这应该被子类覆盖”在描述问题的真正原因时真的很糟糕。
  • 我遇到了同样的问题。根据@BruceMartin 的提及,我可以确认我的 Ubuntu 版本在 proto V3.0.0 上运行,在我的源代码中,我使用的是较低的 V2.6.1。我真的被困在这里,因为我没有看到任何为 V3.0.0 构建 .so 的源代码。这里有什么建议,可以做什么?
  • 我没有看过V3.0.0,但是你有Proto定义的(可能有.proto扩展名)???。如果你这样做了,你应该能够运行一个协议来重新生成接口文件
猜你喜欢
  • 2017-10-26
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
相关资源
最近更新 更多