当前位置: 首页 > 知识库问答 >
问题:

错误与序列化与协议buf

尤茂材
2023-03-14

我试图序列化一个结构与原型。经过几个小时试图找出我做错了什么,我决定测试谷歌的例子,但它没有工作得那么好

我有以下协议从谷歌(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:这应该被子类重写。”

感谢;

共有1个答案

闻人高卓
2023-03-14

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

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

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

使用protocol buffers 2.5.0,必须使用protoc 2.5.0版本(或在windows protoc.exe上)重新生成所有java类。

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

java.lang.VerifyError: class xxx.xxx.xx.. 
overrides final method getUnknownFields.()Lcom/google/protobuf/UnknownFieldSet;
 类似资料:
  • SOFARPC 可以在使用 Bolt 通信协议的情况下,可以选择不同的序列化协议,目前支持 hessian2 和 protobuf。 默认的情况下,SOFARPC 使用 hessian2 作为序列化协议,如果需要将序列化协议设置成 protobuf,在发布服务的时候,需要做如下的设置: <sofa:service ref="sampleService" interface="com.alipay.

  • 我尝试调用一个url谁接受列表。 发送的数据为 “{”时间戳“:1445958336633,”状态“:400,”错误“:”错误请求“,”异常“:”org.springframework.http.converter.httpmessagenotreadableException“,”消息“:”无法读取文档:无法反序列化START_OBJECT令牌之外的java.util.arraylist实例\n

  • FAQs in section [36]: [36.1]“序列化”是什么东东? [36.2] 如何选择最好的序列化技术? [36.3] 如何决定是要序列化为可读的(“文本”)还是不可读的(“二进制”)格式? or non-human-readable ("binary") format?") [36.4] 如何序列化/反序列化数字,字符,字符串等简单类型? [36.5] 如何读/写简单类型为可读的

  • 上一小节我们学习了 Java 的输入输出流,有了这些前置知识点,我们就可以学习 Java 的序列化了。本小节将介绍什么是序列化、什么是反序列化、序列化有什么作用,Serializable 接口以及 Externalizable 接口,常用序列化工具介绍等内容。 1. 序列化与反序列化 序列化在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式,以留待后续在相同或另一台计算机环境中,能

  • 要想团队协作使用Git,就需要用到Git协议。 3.1.1. Git支持的协议 首先来看看数据交换需要使用的协议。 Git提供了丰富的协议支持,包括:SSH、GIT、HTTP、HTTPS、FTP、FTPS、RSYNC及前面已经看到的本地协议等。各种不同协议的URL写法如表15-1所示。 表 15-1:Git支持的协议一览表 协议名称 语法格式 说明 SSH协议(1) ssh://[user@]ex

  • 这就是我想要实现的: > 在Proc#1中使用google协议缓冲区建模对象 使用proto-buf序列化该对象,并将其发送到posix消息队列。 在Proc#2中读取流并将其反序列化为类似的模型,同时使用协议缓冲区。 换句话说: 进程1中的对象-- 问题是Proc#1和Proc#2可能是完全不同的语言平台。程序#1通常是C与g相一致的。但是Proc#2可以是任何东西:Python、Java等等。