ProtoBuf-Net做原始读取

时间:2014-12-02 00:13:50

标签: .net protocol-buffers protobuf-net

我希望有一段简单的代码可以遍历协议缓冲区的随机流,并打印出内容而不必明确理解结构内容。在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”并且永远不会前进。如何前进到流中的下一个元素?

1 个答案:

答案 0 :(得分:1)

ReadFieldHeader()应该在循环中:

while(protoReader.ReadFieldHeader() > 0)
{
    //...
}

注意:如果您不知道如何处理给定字段,则会有<{1}}方法正确读取数据 - 例如:

.SkipField()

每个字段标题必须读取或跳过一次数据。

对于组和子项,您需要使用default: Console.WriteLine(protoReader.WireType); protoReader.SkipField(); break; 等:

StartSubItem

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