2014-12-02 76 views
1

我想要一个简单的代码片段,它将循环访问协议缓冲区的随机流,并在没有对结构内容的明确理解的情况下打印出内容。东西是相当于XmlReader.Read()while循环ProtoBuf-Net做原始读取

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

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()