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

时间:2011-12-22 09:15:26

标签: c# protobuf-net

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

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

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

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

1 个答案:

答案 0 :(得分:10)

基本上,它是一个额外的标记可以(虽然不一定)用于记录被添加的消息的“类型”,因为推定(使用{{时) 1}}方法)是在同一个流中有多个消息。

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

使用方法:

  • 您可以序列化*WithLengthPrefix,然后重复反序列化(带有 - 长度 - 前缀)单个List<Foo>项,反之亦然
  • 使用异构对象集,您可以使用Foo API来允许基于标记的类型解析,即代码等效于“if 1 then Invoice; if 2 then Order,if 3 then skip”它,如果是4那么客户“等 - 如果使用Serializer.NonGeneric作为消息发送设备,这将特别有用。这种方法(每种类型使用不同的标记)允许您从流中读取对象,并正确地反序列化它们,而无需事先知道下一条消息的类型

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