什么是protobuf-net SerializeWithLengthPrefix标签参数

本文关键字:标签 参数 SerializeWithLengthPrefix protobuf-net 什么 | 更新日期: 2023-09-27 18:18:30

这个方法接受一个整数作为最后一个参数,但我不确定我是否理解我将使用它到底是什么。

Serializer.SerializeWithLengthPrefix(stream, object, PrefixStyle.Base128, [tag]);

对于相应的Deserialize方法也是如此。

它只是一种标记消息的方法,以便在反序列化中添加某种"查询"功能,以过滤掉不需要的消息,或者它还有其他用途吗?

什么是protobuf-net SerializeWithLengthPrefix标签参数

基本上,它是一个额外的标记,可以被用来(尽管不是必须)标记被添加的消息的"类型",因为假定(当使用*WithLengthPrefix方法时)在同一流中有多个消息。

通过包含

,它还意味着整个复合流是本身一个完全有效的protobuf消息。

使用方法:

  • 您可以序列化List<Foo>,然后重复反序列化(使用-length-prefix)单个Foo项,反之亦然
  • 与异构的对象集,你可以使用Serializer.NonGeneric API允许基于标签的类型解析,即代码相当于"如果1然后发票;如果是2则是Order,如果是3则跳过它,如果是4则是Customer,等等——这在使用NetworkStream作为消息发送设备时特别有用。这种方法(每种类型使用不同的标记)允许您从流中读取对象,并正确地反序列化它们,而无需事先知道下一条消息
  • 类型

如果你愿意,可以省略这个-只要通过零(IIRC)。这将(通常)为附加的每个消息节省一个字节,但这意味着流本身不再是有效的协议。当然,它仍然可以通过读取时传递零来读取。