代码之家  ›  专栏  ›  技术社区  ›  ata

调用PARSEOF程序实现原动机的Java实现

  •  1
  • ata  · 技术社区  · 15 年前

    我有一条信息(说它叫外消息)

    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网络序列化消息。知道是什么引起了这个问题吗?

    更新: 我检查了调试器控制台,引发了以下异常:

    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 在许多其他消息中也使用,这些消息似乎初始化得很好。为了解决这个问题,我应该考虑什么具体的事情?

    1 回复  |  直到 15 年前
        1
  •  1
  •   Marc Gravell    15 年前

    是什么 buffer ?是小溪吗?字节数组?什么?我问的原因是protobuf(默认情况下)不包含长度头,所以它读取到流的末尾。如果流保持打开(可能是一个开放的网络套接字),那么它将不知道要结束,并将挂起(这可能是您看到的)。当然,有很多方法可以避开这一点,同时让河流保持畅通。

    如果这不是问题所在,您是否可以指示(可能是十六进制)缓冲区内容以及正在序列化的值?我想知道这是一个序列化问题,还是一个解析问题…