我有一条消息(称为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
也用于许多其他似乎初始化正常的消息中。我应该考虑解决这个问题的具体事情吗?
答案 0 :(得分:1)
什么是buffer
?它是一条流吗?一个字节数组?什么?我问的原因是protobuf(默认情况下)不包含长度标题,因此它会读到流的末尾。如果流被打开(可能是一个开放的网络套接字),那么它将不知道结束并将挂起(这可能是你所看到的)。当然,有很多方法可以解决这个问题。
如果这不是问题,您是否可以指示(可能是十六进制)缓冲区内容以及您要序列化的值?我想弄清楚它是序列化问题还是解析问题......