调用parseFrom以执行protobuf的java实现程序挂起

时间:2010-05-05 07:19:41

标签: protobuf-net protocol-buffers

我有一条消息(称为OuterMessage)

message OuterMessage {
    optional int64 id = 1;
    optional InnerMessage inner = 2;
}

和内部消息

message InnerMessage {
    optional string type = 1;
    optioanl int64 id = 2;
}

现在当我在OuterMessage上调用像OuterMessage.parseFrom(buffer)这样的parseFrom时,方法永远不会返回,也不会抛出任何异常。但是如果我做InnerMessage.parseFrom(buffer)它会返回一个空的InnerMessage实例。

我正在使用protobuf-net对消息进行序列化。知道可能导致这个问题的原因吗?

更新: 我检查了调试器控制台,并抛出了以下异常:

Caused by: java.lang.IllegalArgumentException: Invalid embedded descriptor for "KeyValuePackageResponse.proto".
        at com.google.protobuf.Descriptors$FileDescriptor.internalBuildGeneratedFileFrom(Descriptors.java:286)
        at com.myproj.protobuf.KeyValuePackageResponseProtocol.<clinit>(KeyValuePackageResponseProtocol.java:538)
        ... 15 more
Caused by: com.google.protobuf.Descriptors$DescriptorValidationException: KeyValuePackageResponse.proto: Dependencies passed to FileDescriptor.buildFrom() don't match those listed in the FileDescriptorProto.
        at com.google.protobuf.Descriptors$FileDescriptor.buildFrom(Descriptors.java:231)
        at com.google.protobuf.Descriptors$FileDescriptor.internalBuildGeneratedFileFrom(Descriptors.java:284)

我检查了.proto文件,它同样适用于java和C#。此消息KeyValuePackageResponseProtocol也用于许多其他似乎初始化正常的消息中。我应该考虑解决这个问题的具体事情吗?

1 个答案:

答案 0 :(得分:1)

什么是buffer?它是一条流吗?一个字节数组?什么?我问的原因是protobuf(默认情况下)不包含长度标题,因此它会读到流的末尾。如果流被打开(可能是一个开放的网络套接字),那么它将不知道结束并将挂起(这可能是你所看到的)。当然,有很多方法可以解决这个问题。

如果这不是问题,您是否可以指示(可能是十六进制)缓冲区内容以及您要序列化的值?我想弄清楚它是序列化问题还是解析问题......