1

我有一条消息(说它叫做 OuterMessage)

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

和内心的讯息

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

现在,当我在 OuterMessage 上调用 parseFrom 时,OuterMessage.parseFrom(buffer)该方法永远不会返回,也不会抛出任何异常。但如果我这样做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)

我检查了 java 和 C# 的 .proto 文件。该消息KeyValuePackageResponseProtocol还用于许多其他似乎初始化良好的消息。我应该看什么来解决这个问题?

4

1 回答 1

1

是什么buffer?是流吗?一个字节数组?什么?我问的原因是protobuf(默认情况下)不包含长度标头,因此它会读取到流的末尾。如果流保持打开状态(可能是打开的网络套接字),那么它不会知道结束并会挂起(这可能是您所看到的)。当然,有一些方法可以在保持流打开的同时解决这个问题。

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

于 2010-05-05T08:04:21.443 回答