是否可以检测原始协议缓冲区消息的类型(以字节[]为单位)
我遇到的情况是端点可以接收不同的消息,并且我需要能够在反序列化之前检测到类型。
我正在使用 protobuf-net
您无法单独检测类型,因为 protobuf 规范不会为此向流添加任何数据;但是,根据具体情况,有多种方法可以轻松实现这一点:
- 联合类型(如乔恩提到的)涵盖了一系列场景
- 继承(特定于 protobuf-net)可以是通用的 - 您可以拥有基本消息类型和任意数量的具体消息类型
- 您可以使用前缀来指示传入类型
对于原始 TCP 流,最后一种方法实际上非常有价值;这是在电线上与联合类型相同,但实现不同;通过提前决定 1=Foo, 2=Bar 等(与联合类型方法完全相同),您可以使用SerializeWithLengthPrefix
写入(指定 1/2/etc 作为字段号),以及非泛型TryDeserializeWithLengthPrefix
要阅读(这位于 v1 API 中的 Serializer.NonGeneric 下,或位于 v2 API 中的 TypeModel 上),您可以提供一个类型映射,将数字解析回类型,从而反序列化正确的类型。并先解决“为什么这对 TCP 流有用?”的问题。 - 因为:在正在进行的 TCP 流中,您need使用WithLengthPrefix
方法anyway,避免过度读取流;所以你不妨免费获得类型标识符!
summary:
- union类型:易于实现;唯一的缺点是必须检查哪些属性不为空
- 继承:易于实现;可以使用多态性或判别器来处理“现在做什么?”
- 类型前缀:实现起来有点复杂,但具有更大的灵活性,并且 TCP 流的开销为零
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)