C# 使用Protobuf.net反序列化单个结构字段

C# 使用Protobuf.net反序列化单个结构字段,c#,protobuf-net,C#,Protobuf Net,我有一个关于使用Protobuf.Net进行反序列化的问题。我试图用它替换XMLSerializer,但我找不到从文件中反序列化单个字段的方法。 我需要的信息,如果文件被修改,这是保存的结构中的字段之一 有可能吗?如果是,我可以寻求帮助吗 关于坦白地说,在大多数情况下,你可以反序列化整个事情——它会很快,等等。但是,如果你真的想限制它,有几个选择 最简单的方法是创建一个较小的模型,其中包含您想要的信息。因此:如果您的原始模型上有46个字段,其中5个是集合等,但您只需要字段12中的版本,那么: [

我有一个关于使用Protobuf.Net进行反序列化的问题。我试图用它替换XMLSerializer,但我找不到从文件中反序列化单个字段的方法。
我需要的信息,如果文件被修改,这是保存的结构中的字段之一

有可能吗?如果是,我可以寻求帮助吗


关于

坦白地说,在大多数情况下,你可以反序列化整个事情——它会很快,等等。但是,如果你真的想限制它,有几个选择

最简单的方法是创建一个较小的模型,其中包含您想要的信息。因此:如果您的原始模型上有46个字段,其中5个是集合等,但您只需要字段12中的
版本
,那么:

[ProtoContract]
public class InsertNameHere {
    [ProtoMember(12)]
    public int Version {get;set;}
}
现在反序列化:

您可能希望使用上述命令的原因是,它可以更早地停止查找-即,一旦找到字段12,我们就可以在不处理文件其余部分的情况下杀死读取器。通常,如果我们知道数据很大,并且我们不需要太多数据,我只会使用第二种方法


从技术上讲,protobuf是一种可追加的格式,因此在理论上,文件末尾可能有另一个“字段12”。根据说明,这是“最后的价值胜出”,因此上述短路(理论上)可能会给出不同的答案。然而!这是非常不可能的,并且您通常会知道您是否正在利用附加的消息。这并不适用于大多数人。

在这种情况下,我认为如果你发布一些
XMLSerializer
代码,作为你在帖子中使用protobuf.netThanks回答问题的基础,这将有助于人们回答这个问题。这很有帮助。
var obj = Serializer.Deserialize<InsertNameHere>(source);
int version = obj.Version;
int version = 0;
using (var reader = new ProtoReader(source, RuntimeTypeModel.Default, null))
{
    int field;
    bool keepReading = true;
    while ((field = reader.ReadFieldHeader()) > 0 && keepReading)
    {   
        switch (field)
        {
            case 12:
                version = reader.ReadInt32();
                // STOP LOOPING (leaves the stream partly-read)
                keepReading = false;
                break; 
            default:
                reader.SkipField();
                break;
        }
    }
}