博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python protobuf在不确定消息类型的情况下解析消息
阅读量:5102 次
发布时间:2019-06-13

本文共 899 字,大约阅读时间需要 2 分钟。

Protobuf 不是一个自描述的协议,序列化后的二进制消息中应该没有必要的类型信息。所以采取往消息体中增加额外信息的方式来辅助确定消息类型。

  1. 使用枚举MsgType定义消息类型,每种消息对应一种消息类型
  2. 所有的消息都有一个消息类型字段,注意此字段的编号保持确定
  3. 定义辅助消息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)

转载于:https://www.cnblogs.com/li-dp/p/6062151.html

你可能感兴趣的文章
爱的十个秘密--8.沟通的力量
查看>>
mysql 自动加上编号
查看>>
Message no. C6015--No valuation variant found for valuation area xxxx
查看>>
Program Variant Scheduling job
查看>>
.net之路
查看>>
题目2-括号配对问题
查看>>
python 面向对象oop
查看>>
linux 安装 Django
查看>>
Heap:Sunscreen(POJ 3614)
查看>>
Storm-源码分析-Streaming Grouping (backtype.storm.daemon.executor)
查看>>
Hadoop TDG 2 – I/O
查看>>
C#中 As 和强制转换的总结
查看>>
POJ2227(优先队列)
查看>>
PCB 铺铜
查看>>
Calendar(显示日期)
查看>>
一周最新示例代码回顾 (4/23–4/29)
查看>>
转载:字符串的驻留(String Interning)
查看>>
C语言指针总结
查看>>
monoGSM信号强度示例
查看>>
软件工程--功能规格说明书
查看>>