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 には (デフォルトで) 長さヘッダーが含まれていないため、ストリームの最後まで読み取るためです。ストリームが開いたままになっている場合 (ネットワーク ソケットが開いている可能性があります)、ストリームは終了することを認識せず、ハングします (これが表示されている可能性があります)。もちろん、ストリームを開いたままにして、これを回避する方法はあります。

これが問題でない場合は、バッファの内容とシリアル化する値を (おそらく 16 進数で) 示してもらえますか? それがシリアライゼーションの問題なのか、解析の問題なのかを突き止めたいと思います...

于 2010-05-05T08:04:21.443 に答える