gpt4 book ai didi

c# - Protocol Buffer 从原始消息中检测类型

转载 作者:可可西里 更新时间:2023-11-01 07:51:35 24 4
gpt4 key购买 nike

是否可以检测原始 Protocol Buffer 消息的类型(在 byte[] 中)

我遇到这样一种情况,端点可以接收不同的消息,我需要能够在反序列化之前检测到类型。

我正在使用 protobuf-net

最佳答案

您无法单独检测类型,因为 protobuf 规范不会为此向流添加任何数据;但是,根据上下文,有多种方法可以简化此过程:

  • 联合类型(如 Jon 所述)涵盖了一系列场景
  • 继承(特定于 protobuf-net)可以是通用的——您可以有一个基本消息类型,以及任意数量的具体消息类型
  • 可以使用前缀来表示传入类型

最后一种方法在原始 TCP 流的情况下实际上非常有值(value);这线上与联合类型相同,但实现不同;通过预先确定 1=Foo, 2=Bar 等(就像您对联合类型方法所做的一样),您可以使用 SerializeWithLengthPrefix 来编写(指定 1/2/etc 作为字段编号),以及要读取的非泛型 TryDeserializeWithLengthPrefix(这是在 v1 API 中的 Serializer.NonGeneric 下,或在 v2 API 中的 TypeModel 下),您可以提供解析数字的类型映射回到类型,从而反序列化正确的类型。并抢先提出问题“为什么这对 TCP 流有用?” - 因为:在正在进行的 TCP 流中,您需要使用 WithLengthPrefix 方法无论如何,以避免过度读取流;所以你不妨免费获得类型标识符!

总结:

  • 联合类型:易于实现;唯一的缺点是必须检查哪些属性是非空的
  • 继承:易于实现;可以使用多态性或鉴别器来处理“现在怎么办?”
  • 类型前缀:实现起来有点麻烦,但允许更大的灵 active ,并且对 TCP 流的开销为零

关于c# - Protocol Buffer 从原始消息中检测类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9121612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com