Yav*_*sov 15 .net c# protocol-buffers protobuf-net
是否可以检测原始协议缓冲区消息的类型(在byte []中)
我有一种情况,端点可以接收不同的消息,我需要能够检测类型,然后才能反序列化它.
我正在使用protobuf-net
Mar*_*ell 16
您不能孤立地检测类型,因为protobuf规范不会为此向流添加任何数据; 但是,根据具体情况,有很多方法可以简化:
在原始TCP流的情况下,最后一种方法实际上非常有价值; 这与导线类型相同,但具有不同的实现; 通过事先决定1 = Foo,2 = Bar等(与联合类型方法完全一样),您可以使用SerializeWithLengthPrefix写入(指定1/2/etc作为字段编号),并且非泛型TryDeserializeWithLengthPrefix为read(这是在v1 API中的Serializer.NonGeneric或v2 API中的TypeModel下),您可以提供一个类型映射,将数字解析回类型,从而反序列化正确的类型.并预先解决"为什么这对TCP流有用?" - 因为:在正在进行的TCP流中,无论如何都需要使用这些WithLengthPrefix方法,以避免过度读取流; 所以你不妨免费获得类型标识符!
摘要:
你可以这样包裹它。数据将保存实际消息的位置。
message MyCustomProtocol {
required int32 protocolVersion = 1;
required int32 messageType = 2;
bytes data = 3;
}
Run Code Online (Sandbox Code Playgroud)
协议的一般规则是包含协议版本。一旦您拥有新老客户,您就会很高兴拥有它。
| 归档时间: |
|
| 查看次数: |
6365 次 |
| 最近记录: |