2014-12-02 1 views
1

Я хочу иметь простую часть кода, которая будет проходить через случайный поток буферов протокола и распечатать содержимое без явного понимания структурного содержимого. То, что эквивалентно XmlReader.Read() внутри цикла в то время какProtoBuf-Net сделать raw 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

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