Программа зависает при вызове parseFrom для java-реализации protobuf - PullRequest
1 голос
/ 05 мая 2010

У меня есть сообщение (скажем, оно называется OuterMessage)

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

и внутреннее сообщение

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

Теперь, когда я вызываю parseFrom в OuterMessage, как OuterMessage.parseFrom(buffer), метод никогда не возвращается и не выдает никаких исключений. Но если я сделаю InnerMessage.parseFrom(buffer), он вернет пустой экземпляр InnerMessage.

Я сериализую сообщение, используя protobuf-net. Есть идеи, что может быть причиной проблемы?

UPDATE: Я проверил консоль отладчика, и возникло следующее исключение:

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 Ответ

1 голос
/ 05 мая 2010

Что такое buffer? Это поток? байтовый массив? Какие? Причина, по которой я спрашиваю, состоит в том, что protobuf (по умолчанию) не включает заголовки длины, поэтому он читает до конца потока. Если поток оставить открытым (возможно, открытый сетевой сокет), он не будет знать, что он закончится, и будет зависать (что, возможно, вы и видите). Конечно, есть способы обойти это, оставляя поток открытым.

Если это не проблема, можете ли вы указать (возможно, в шестнадцатеричном виде) содержимое буфера и значения, которые вы сериализуете? Я хотел бы выяснить, является ли это проблемой сериализации или проблемой синтаксического анализа ...

...