当前位置: 首页 > 面试题库 >

protobuf序列化错误

国俊艾
2023-03-14
问题内容

我正在尝试使用protobuf序列化结构。经过许多小时试图弄清楚我在做什么错,我决定测试google的示例,但效果不佳

我从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:应该被子类覆盖。”

谢谢;


问题答案:

正如Marc所说,协议缓冲区版本不匹配会给您确切的信息。特别是如果

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

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

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

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

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


 类似资料:
  • 我需要通过flink消费Kafka,不幸的是,Kafka消息是在serde中使用原型,完全不知道如何处理它,这里是来自互联网的代码,但我不能使它工作。 这不起作用,它会让NPE: 有人知道我做错了什么吗?使用twitter ProtobufSerializer是唯一值得拥有protobuf的方法吗?还是还有别的路要走?

  • 试图在Java中使用protobuf反序列化消息,并得到以下异常。 原因:com.google.protobuf.InvalidProtocolBufferException:在解析协议消息时,输入意外地在字段中间结束。这可能意味着输入被截断,或者嵌入的消息错误报告了自己的长度。在com.google.protobuf.InvalidProtocolBufferException.Truncate

  • 我试图阅读和打印从Kafka使用Apache Flink的原型消息。 我遵循官方文件,但没有成功:https://nightlies.apache.org/flink/flink-docs-master/docs/dev/datastream/fault-tolerance/serialization/third_party_serializers/ Flink消费者代码是: 反序列化器代码是:

  • 在任何人试图告诉我这是一个重复之前,我已经试过了关于这个的解决方案,以及几乎所有其他我能找到的答案。 我的项目在IntelliJ中构建得很好,通过了我设置的所有测试,它甚至在IntelliJ内部运行得也很好,当我试图运行maven构建的JAR时,除了几个例外,我就被打了个耳光。 代码所指向的类: 根据我看到的例外情况,当通过命令提示符运行时,问题出现在第31行,它将是: 命令提示符中的堆栈跟踪如下

  • 我使用协议缓冲区在c和c#客户机-服务器应用程序之间发送和接收数据。我用protobuf网来解决这个问题。我有两个原始文件,一个请求命令和一个响应命令。我能够将命令从c#客户端发送到c服务器并进行反序列化。但我不能用c#反序列化。 我在缓冲区中以字节为单位获取数据,但它不会在响应命令中反序列化。

  • ClassCastException:com.google.gson.internal.LinkedTreeMap不能强制转换为java.util.HashMap 提前谢了。