C# 为什么CodedInputStream将流位置设置为结束?

C# 为什么CodedInputStream将流位置设置为结束?,c#,protocol-buffers,C#,Protocol Buffers,我在c#中使用协议缓冲区3。我试图在流中跳转以查找每条消息的起始位置,而不实际反序列化消息。所有消息都会写入流,并使用WriteDelimitedTo 然后,我使用以下代码尝试从长度标记跳转: _map = new List<int>(); _stream.Seek(0, SeekOrigin.Begin); var codedStream = new CodedInputStream(_stream); while (_stream.Position < _stream.

我在c#中使用协议缓冲区3。我试图在流中跳转以查找每条消息的起始位置,而不实际反序列化消息。所有消息都会写入流,并使用
WriteDelimitedTo

然后,我使用以下代码尝试从长度标记跳转:

_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);
}
\u map=newlist();
_stream.Seek(0,SeekOrigin.Begin);
var codedStream=新的CodedInputStream(_stream);
while(_stream.Position<_stream.Length)
{
var length=codedStream.ReadInt32();
_地图添加((int)\流位置);
_Seek(长度,SeekOrigin.Current);
}

但是,当我执行
codedStream.ReadInt32()
时,流的位置被设置到末尾,而不仅仅是varint32之后的下一个字节

此行为是由于
CodedInputStream
将原始流缓冲为。它可能不适合通过流手动读取和查找。另一种方法是使用Marc Gravell的部分源代码来读取
变量
,并直接在原始流中移动

什么是
\u流
?里面有什么?它是否包含多个整数?此外,如果不先读取所有内容,网络流通常无法确定其长度。通过检查
.Length
而不是EOF或
读取的结果,您可能正在读取并丢弃所有内容。这就是为什么大多数流样本检查读取的字节数,而不是大小。只是一个内存流。是的,它在单元测试中。我写了3条消息,并尝试跳转长度前缀。但出于某种原因,CodedInputStream不仅读取varin32的字节,它还将查找基流到底。与其尝试操作底层流,不如使用
CodedInputStream.isAttend
。触摸底层流是一个坏主意-您已经用另一个流包装了原始流,这可能会缓冲或以其他方式处理其底层流。检查的代码,似乎确实是这样。我不知道在您使用的特定库中是否可以方便地使用它,但绝对可以以非缓冲方式读取变量(在不过度读取的情况下使用数据的想法),然后读取长度受限的流或使用长度受限的读取器。-(另一半见L112-L1142);请随意借用这两种方法,如果它们有用的话。是的,我脑海中有你的代码作为解决方案。