C# protobuf net SerializeWithLengthPrefix标记参数用于什么?

C# protobuf net SerializeWithLengthPrefix标记参数用于什么?,c#,protobuf-net,C#,Protobuf Net,这个方法接受整数作为最后一个参数,但我不确定我是否理解它的确切用途 Serializer.SerializeWithLengthPrefix(stream, object, PrefixStyle.Base128, [tag]); 对应的反序列化方法也是如此 它只是一种标记消息的方法,在反序列化上添加某种“查询”功能以过滤掉不需要的消息,还是有任何其他用途?基本上,它是一个额外的标记,可以(尽管不一定)用于记明添加的消息的“类型”,因为假定(使用*with length prefix方法时)是

这个方法接受整数作为最后一个参数,但我不确定我是否理解它的确切用途

Serializer.SerializeWithLengthPrefix(stream, object, PrefixStyle.Base128, [tag]);
对应的反序列化方法也是如此


它只是一种标记消息的方法,在反序列化上添加某种“查询”功能以过滤掉不需要的消息,还是有任何其他用途?

基本上,它是一个额外的标记,可以(尽管不一定)用于记明添加的消息的“类型”,因为假定(使用
*with length prefix
方法时)是指同一流中有多条消息

通过被包括,它还意味着整个复合流本身就是一个完全有效的protobuf消息

使用方法:

  • 您可以序列化
    列表
    ,然后重复反序列化(使用长度前缀)单个
    Foo
    项,反之亦然
  • 对于异构对象集,您可以使用
    序列化程序.NonGeneric
    API允许基于标记的类型解析,即代码等效于“如果1,则发票;如果2,则订单;如果3,则跳过它,如果4,则客户”,等等-如果使用
    网络流
    作为消息发送设备,这一点尤其有用。这种方法(每种类型使用不同的标记)允许您从流中读取对象,并正确地反序列化它们,而无需事先知道下一条消息的类型

如果您愿意,可以省略此项-只需传递零(IIRC)每个消息附加一个字节,但是:这意味着流本身不再是有效的protobuf。当然,在读取时通过零仍然可以读取它。

为什么包含标记使其成为有效的protobuf消息?您不能在没有标记的情况下反序列化列表中的单个项吗?此外,使用标记的类型解析必须由e应用程序代码,对吗?@Simone它使复合消息成为有效的protobuf,因为
重复消息类型
(in.proto)被编码为“[tag][length][payload]…[tag][length][payload]的序列。”。因此,有了标签,它是一个有效的protobuf,而没有:它不是。Re类型解析;通常是的,因为它有意独立于平台;但是,protobuf net还包括一些额外的支持,用于在线路上包含一些有限的类型信息。