【问题标题】:What is protobuf-net SerializeWithLengthPrefix tag argument for?protobuf-net SerializeWithLengthPrefix 标签参数是什么?
【发布时间】:2012-01-25 23:06:48
【问题描述】:

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

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

对应的反序列化方法也是如此。

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

【问题讨论】:

    标签: c# protobuf-net


    【解决方案1】:

    基本上,它是一个额外的标记,可以(尽管不是必须)用来记录正在添加的消息的“类型”,因为假设(当使用@987654321 @方法)是同一流中有多个消息。

    被包含也意味着整个复合本身是一个完全有效的protobuf消息。

    使用方法:

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

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

    【讨论】:

    • 为什么包含标签使其成为有效的 protobuf 消息?你不能在没有标签的情况下反序列化列表中的单个项目吗?
    • 另外,使用标签的类型解析必须由应用程序代码执行,对吧?
    • @Simone 它使 composite 消息成为有效的 protobuf,因为 repeated MessageType(在 .proto 中)被编码为“[tag][length][payload ]...[标签][长度][有效载荷]”。因此,带有标签的它是一个有效的 protobuf,而没有:它不是。重新输入分辨率;通常是的,因为它是故意独立于平台的;然而,protobuf-net 还包含一些附加支持,用于在线路上包含一些有限的类型信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    相关资源
    最近更新 更多