2

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以外のすべてについては、例外があります。

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

私は不可能なことを試みていますか、それとも何か間違ったことをしているだけですか?

4

1 に答える 1

4

ProtostuffIOUtil問題は単純でした:メッセージを(逆)シリアル化するために使用する代わりに、使用する必要がありますProtobufIOUtil

于 2012-07-04T08:54:43.957 に答える