2013-06-02 5 views
5

ich mehr Protokollpuffer Nachrichten in Java zu analysieren versuchen, die in vb.net erzeugt werdenProtobuf C# java Deserialisieren mehr Nachrichten

ich das hervorragende protobuf-net nach unten mehr Nachrichten auf Java streamen bin mit:

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

In Java, ich folgenden Code verwenden die Nachrichten

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)); 
} 

Problem ist nach dem ersten Nachricht wird analysiert, zu analysieren, wirft es Fehler für das Parsen se Zeit mit folgendem Fehler:

com.google.protobuf.InvalidProtocolBufferException: While parsing a protocol message, the input ended unexpectedly in the middle of a field. This could mean either than the input has been truncated or that an embedded message misreported its own length.

Sollte die Puffergröße und die Nachrichtengröße gleich sein? Wenn ja, wie soll ich es analysieren, besonders für große Nachrichten.

+0

Das Entfernen von '[C#]' und '[vb.net]' als Antwort scheint sich nicht auf beide zu beziehen. –

+0

Hallo, ich habe ein sehr ähnliches Problem, könntest du weiter auf deine Lösung eingehen. I C# Datei, die eine Datei mit vielen proto-Nachrichten analysiert und es verwendet den gleichen Code, den Sie ProtoBuf.Serializer.SerializeWithLengthPrefix (MNG) eingefügt (postStream, msg, ProtoBuf.PrefixStyle.Base128) –

Antwort

2

Das Problem ist, dass Sie direkt aus dem ursprünglichen Stream lesen müssen, nicht einen Block zu einer Zeit. (Auch wenn Sie wissen, jede Nachricht genau 4096 Bytes, man kann nicht sicher sein, dass viel auf einmal lesen) Ich schlage vor, Sie

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

verwenden Hinweis: TCP ist ein Streaming-Protokoll, kein Nachrichtenprotokoll. Sie können nur ein Byte nach dem anderen lesen, und jedes zusätzliche Byte, das Sie erhalten, ist ein Bonus.

+0

Problem ist, wenn ich Ich sende n Nachrichten in einem httpwebrequest-Stream, wie löse ich in Java InputStream, um n Nachrichten zu erhalten. – gaurav46

+0

@ gaurav46 Legen Sie es in eine Schleife? –

+0

@PeterLawery Hmm ... Ich hätte das gedacht :). Vielen Dank. Lass es mich ausprobieren. – gaurav46

Verwandte Themen