.net ProtoBuf Net进行原始读取

.net ProtoBuf Net进行原始读取,.net,protocol-buffers,protobuf-net,.net,Protocol Buffers,Protobuf Net,我想要一段简单的代码,它将遍历协议缓冲区的随机流,并在不明确理解结构内容的情况下打印出内容。while循环中与XmlReader.Read()等价的内容 using (ProtoBuf.ProtoReader protoReader = new ProtoBuf.ProtoReader(stream1, null, new ProtoBuf.SerializationContext { })) { protoReader.ReadFieldHead

我想要一段简单的代码,它将遍历协议缓冲区的随机流,并在不明确理解结构内容的情况下打印出内容。while循环中与XmlReader.Read()等价的内容

using (ProtoBuf.ProtoReader protoReader = 
      new ProtoBuf.ProtoReader(stream1, null, 
            new ProtoBuf.SerializationContext { }))
{
    protoReader.ReadFieldHeader();
    while (protoReader.WireType != ProtoBuf.WireType.None)
    {
       switch (protoReader.WireType)
       {
       case ProtoBuf.WireType.Fixed64:
           Console.WriteLine(protoReader.ReadInt64());
           break;
       case ProtoBuf.WireType.Fixed32:
           Console.WriteLine(protoReader.ReadInt32());
           break;
       case ProtoBuf.WireType.StartGroup:
           Console.WriteLine(protoReader.ReadInt32());
           break;
       default:
           Console.WriteLine(protoReader.WireType);
           break;
       }
    }
}
但是,我不知道如何将协议缓冲区提前到下一个元素。在我的测试中,它不断返回“StartGroup”,并且从不前进。如何前进到流中的下一个元素?

循环中应该有
ReadFieldHeader()

while(protoReader.ReadFieldHeader() > 0)
{
    //...
}
注意:如果您不知道如何处理给定字段,则有一个
.SkipField()
方法可以正确读取数据,例如:

default:
    Console.WriteLine(protoReader.WireType);
    protoReader.SkipField();
    break;
每个字段标题必须读取或跳过数据一次

对于组和子项,您需要使用
StartSubItem
等:

var tok = ProtoReader.StartSubItem(protoReader);
// an inner while-loop, etc
ProtoReader.EndSubItem(tok);
或者:使用
SkipField()