什么是protobuf-net SerializeWithLengthPrefix标签参数?

Sim*_*one 12 c# protobuf-net

这个方法接受一个整数作为最后一个参数,但我不确定我是否理解我将完全使用它.

Serializer.SerializeWithLengthPrefix(stream, object, PrefixStyle.Base128, [tag]);
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ell 10

基本上,它是一个额外的标记,可以(虽然不一定)用于记录被添加的消息的"类型",因为假设(当使用该*WithLengthPrefix方法时)是在同一个流中有多个消息.

通过包含,它还意味着整个复合本身是完全有效的protobuf消息.

使用方法:

  • 您可以序列化a List<Foo>,然后重复反序列化(with-length-prefix)单个Foo项目,反之亦然
  • 使用异构对象集合,您可以使用Serializer.NonGenericAPI来允许基于标记的类型解析,即代码等效于"if 1 then Invoice; if 2 then Order,if if then skip it,if 4 then Customer",等 - 如果使用a NetworkStream作为消息发送设备,这尤其有用.这种方法(每种类型使用不同的标记)允许您从流中读取对象,并正确地反序列化它们,而无需事先知道下一条消息的类型

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

  • @Simone它使*composite*消息成为有效的protobuf,因为`重复的MessageType`(在.proto中)被编码为"[tag] [length] [payload] ... [tag] [length] [payload]的序列]".因此,使用标签它是一个有效的protobuf,没有:它不是.重新分辨率; 通常是的,因为它是故意独立于平台的; 然而,protobuf-net还包括一些*附加*支持,用于在线路上包含一些有限的类型信息. (3认同)