Protobuf 不是一個自描述的協議,序列化后的二進制消息中應該沒有必要的類型信息。所以采取往消息體中增加額外信息的方式來輔助確定消息類型。
- 使用枚舉MsgType定義消息類型,每種消息對應一種消息類型
- 所有的消息都有一個消息類型字段,注意此字段的編號保持確定
- 定義輔助消息BaseMsg,只包含一個消息類型字段,用於輔助反序列化
消息定義 xxx.proto文件內容如下:
syntax = "proto3"; // 消息類型,和BaseMsg配合 // 用於客戶端在不知道確切消息類型的情況下解析消息 enum MsgType { BaseMsgType = 0; DepthDataType = 1; KLineDataType = 2; } message BaseMsg{ MsgType msg_type = 1; } // 編號范圍 100 - 199 message DepthData{ MsgType msg_type = 1; string symbol = 101; // 合約代碼,例如IF1612, string symbol_id = 102; // 合約唯一ID … } |
序列化部分:
depth_data = xxx_pb2.DepthData()
depth_data.msg_type = xxx_pb2.DepthDataType # 必須明確設置
depth_data.symbol = "xxx"
binary_msg = depth.SerializeToString()
反序列部分:
base_msg = xxx_pb2.BaseMsg()
base_msg.ParseFromString(binary_msg)
if base_msg.msg_type == xxx_pb2.DepthDataType:
depth_msg = xxx_pb2.DepthData()
depth_msg.ParseFromString(binary_msg)