在不反序列化protobuf复合流的情况下读取消息长度

时间:2014-06-20 20:49:10

标签: c# protobuf-net

我有一个包含多条消息的Stream。我使用SerializeWithLengthPrefix来保存这些消息。

我需要创建一个索引映射来查找 nth 消息的字节偏移量,这样我就可以这样做:

public object Read(int index)
{
    object deserialized;

    _stream.Seek( _map[index], SeekOrigin.Begin);

    ProtoBuf.Serializer.NonGeneric.TryDeserializeWithLengthPrefix(
        _stream,
        ProtoBuf.PrefixStyle.Base128,
        _typeResolver,
        out deserialized
        );

    return deserialized;
}

其中_map是未知的。

目前,我找到地图的解决方案将完全反序列化消息。

所以我有两个问题;

我是否可以跳过长度前缀并查找每条消息的所有起始(字节偏移)位置,而无需反序列化整个消息流?

是否可能只是简单地反序列化消息并跟踪流位置的变化会更快?

1 个答案:

答案 0 :(得分:3)

由于您使用的是base-128前缀,因此每条消息可能只需使用Serializer.TryReadLengthPrefix两次。第一次返回字段标题 - 第二次是长度。然后向前跳过那么多字节到下一条消息。