I'm using protocol buffers 3 in c#. I'm trying to bounce through a stream to find the start locations of each message, without actually Deserialising the messages. All messages are written to the stream with WriteDelimitedTo
.
I then use this code to try to jump from length markers:
_map = new List<int>();
_stream.Seek(0, SeekOrigin.Begin);
var codedStream = new CodedInputStream(_stream);
while (_stream.Position < _stream.Length)
{
var length = codedStream.ReadInt32();
_map.Add((int) _stream.Position);
_stream.Seek(length, SeekOrigin.Current);
}
However, the moment I do codedStream.ReadInt32()
the stream position is set to the end, rather than just the next byte after the varint32.
_stream
? What does it contain? Does it contain more than one integer? Besides, network streams typically can't determine their Length without reading everything first. By checking.Length
instead of EOF or the result ofRead
, you may be reading and discarding everything. That's why most Stream samples check the number of bytes read, not the size. – BechuanaCodedInputStream.IsAtEnd
. Touching the underlying stream is a bad idea - you've wrapped the original stream with another, that may buffer or otherwise process its underlying stream. Checking CodedInputStream's code, it seems that is indeed the case. – Bechuana