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