java - Protobuf 和 Protostuff 之间的兼容性

标签 java compatibility protocol-buffers protostuff

Protostuff 代码生成器生成的类与 Protobuf 创建的类兼容吗?

我尝试序列化(反)序列化一些简单的消息,但出现了几个异常:

原始文件 (WrapperClass.proto)

package tutorial;
option java_package = "com.example.tutorial";
message ProjectId {
    required int32 id = 1;
}
message UserId {
    required ProjectId project = 1;
    required int32 projectUserId = 2;
}
message ChannelId {
    required ProjectId project = 1;
    required string name = 2;
}

Protostuff 到 Protobuf 测试(示例)

ProjectId projectId = new ProjectId(1);
byte[] projectarray = ProtostuffIOUtil.toByteArray(projectId, ProjectId.getSchema(), buffer);
com.example.tutorial.WrapperClass.ProjectId returnBufProject = com.example.tutorial.WrapperClass.ProjectId.parseFrom(projectarray);

问题:

一切都适用于 ProjectId,但对于 UserId 和 ChannelId(一切都有点复杂),我得到:

com.google.protobuf.InvalidProtocolBufferException: Message missing required fields: project
    at com.google.protobuf.UninitializedMessageException.asInvalidProtocolBufferException(UninitializedMessageException.java:81)
    at com.example.tutorial.WrapperClass$ChannelId$Builder.buildParsed(Test.java:1278)
    at com.example.tutorial.WrapperClass$ChannelId$Builder.access$17(Test.java:1273)
    at com.example.tutorial.WrapperClass$ChannelId.parseFrom(Test.java:1142)
    ...

反之亦然:

Protobuf 到 Protostuff 测试(示例)

com.example.tutorial.WrapperClass.ProjectId projectId2 = com.example.tutorial.WrapperClass.ProjectId.newBuilder().setId(1).build();
byte[] project2array = projectId2.toByteArray();
ProjectId returnStufProject = new ProjectId();
ProtostuffIOUtil.mergeFrom(project2array, returnStufProject, ProjectId.getSchema());

问题

同样,对于除 ProjectId 之外的所有内容,都有一个异常(exception):

java.lang.RuntimeException: Reading from a byte array threw an IOException (should never happen).
    at com.dyuproject.protostuff.IOUtil.mergeFrom(IOUtil.java:53)
    at com.dyuproject.protostuff.ProtostuffIOUtil.mergeFrom(ProtostuffIOUtil.java:96)
    at JacksonTest.main(JacksonTest.java:92)
Caused by: com.dyuproject.protostuff.ProtobufException: Protocol message contained an invalid tag (zero).
    at com.dyuproject.protostuff.ProtobufException.invalidTag(ProtobufException.java:98)
    at com.dyuproject.protostuff.ByteArrayInput.readFieldNumber(ByteArrayInput.java:220)
    at com.example.tutorial.ProjectId$1.mergeFrom(ProjectId.java:115)
    at com.example.tutorial.ProjectId$1.mergeFrom(ProjectId.java:1)
    at com.dyuproject.protostuff.ByteArrayInput.mergeObjectEncodedAsGroup(ByteArrayInput.java:390)
    at com.dyuproject.protostuff.ByteArrayInput.mergeObject(ByteArrayInput.java:362)
    at com.example.tutorial.UserId$1.mergeFrom(UserId.java:138)
    at com.example.tutorial.UserId$1.mergeFrom(UserId.java:1)
    at com.dyuproject.protostuff.IOUtil.mergeFrom(IOUtil.java:43)
    ... 2 more

我是在尝试一些不可能的事情还是我只是做了一些错误的事情?

最佳答案

问题很简单: 我需要使用 ProtobufIOUtil

,而不是使用 ProtostuffIOUtil 来(反)序列化我的消息

关于java - Protobuf 和 Protostuff 之间的兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11312664/

相关文章:

java - 将 JSON 数组传递给 Java Springs Controller

java - Jenkins:doFill 函数没有正确获取@QueryParameter

java - 类必须声明为抽象或实现抽象方法 : Intellij error?

java - 评估 switch 中的枚举

ios - 如何从Xcode项目中删除iPhone 4s和较低的兼容性

java - 在方法签名/字段中查找不兼容性的工具

protocol-buffers - 如何描述 protobuf-net 中的 Any 类型?

c++ - 为 C++ 寻找一个易于使用的嵌入式键值存储

ios - React-native 会兼容 IOS 10 吗?

go - 如何使用 ProtoBuf 下载文件