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
- 对于异构对象集,您可以使用
API允许基于标记的类型解析,即代码等效于“如果1,则发票;如果2,则订单;如果3,则跳过它,如果4,则客户”,等等-如果使用序列化程序.NonGeneric
作为消息发送设备,这一点尤其有用。这种方法(每种类型使用不同的标记)允许您从流中读取对象,并正确地反序列化它们,而无需事先知道下一条消息的类型网络流
如果您愿意,可以省略此项-只需传递零(IIRC)每个消息附加一个字节,但是:这意味着流本身不再是有效的protobuf。当然,在读取时通过零仍然可以读取它。为什么包含标记使其成为有效的protobuf消息?您不能在没有标记的情况下反序列化列表中的单个项吗?此外,使用标记的类型解析必须由e应用程序代码,对吗?@Simone它使复合消息成为有效的protobuf,因为
重复消息类型
(in.proto)被编码为“[tag][length][payload]…[tag][length][payload]的序列。”。因此,有了标签,它是一个有效的protobuf,而没有:它不是。Re类型解析;通常是的,因为它有意独立于平台;但是,protobuf net还包括一些额外的支持,用于在线路上包含一些有限的类型信息。