5

vb.net で生成された複数のプロトコル バッファ メッセージを Java で解析しようとしています。

以下のように、優れたprotobuf-netを使用して複数のメッセージをJavaにストリーミングしています。

ProtoBuf.Serializer.SerializeWithLengthPrefix(Of Msg)(postStream, msg, 
       ProtoBuf.PrefixStyle.Base128)

Javaでは、次のコードを使用してメッセージを解析しています

final byte[] buffer = new byte[4096];
for (int c = ins.read(buffer); c >= 0; c = ins.read(buffer)) {
  Msg msg = Msg.parseDelimitedFrom(new ByteArrayInputStream(buffer));
}

問題は、最初のメッセージが解析された後、次のエラーで 2 回目の解析でエラーがスローされることです。

com.google.protobuf.InvalidProtocolBufferException: プロトコル メッセージの解析中に、フィールドの途中で入力が予期せず終了しました。これは、入力が切り捨てられたか、埋め込まれたメッセージがそれ自体の長さを誤って報告したことを意味する可能性があります。

バッファ サイズとメッセージ サイズは同じにする必要がありますか? はいの場合、特に大きなメッセージの場合、どのように解析する必要がありますか。

4

1 に答える 1

2

問題は、一度にブロックではなく、元のストリームから直接読み取る必要があることです。(すべてのメッセージが正確に 4096 バイトであることを知っていても、一度にそれほど多くを読み取ることはできません)

while(stream still open) {
    Msg msg = Msg.parseDelimitedFrom(ins);
}

注: TCP はストリーミング プロトコルであり、メッセージ プロトコルではありません。一度に 1 バイトしか読み取れないことが保証されており、取得した余分なバイトはボーナスです。

于 2013-06-02T21:17:18.957 に答える