#pragma once
enum class EPackType
{
reqPackType = 0,
rspPackType = 1,
pubPackType = 9,
rpzmqPackType = 88, // 回报数据不走发布包,zmq发送
notFoundPackType = 99, // 总线找不到服务应答回来统一修改当前类型处理
};
struct AtxHead {
EPackType packType; //包类型
int dataType; //包体类型
int zone; //分片
int local; //本地服务标志
long long packId; //包编号
char destination[64]; //发送目标
int itemByte; //结构体大小
int itemCount;//结构体个数
long long refValue; //自定义异步唯一标识
int retCode; //结果值
char retMsg[256]; //结果消息
void* data;
~AtxHead() { if (data != nullptr) { delete[](unsigned char*)data; data = nullptr; } }
};
#pragma once
class PbData
{
public:
PbData() : m_pBuff(nullptr), m_buffLen(0)
{
}
inline void SetBuffSize(unsigned int len)
{
m_contentLen = len;
if (len > m_buffLen)
{
if (m_buffLen > 0 && m_pBuff != nullptr)
{
delete[] m_pBuff;
}
m_pBuff = new unsigned char[len];
m_buffLen = len;
}
}
inline unsigned int GetContentLen()
{
return m_contentLen;
}
inline unsigned int GetBuffSize()
{
return m_buffLen;
}
inline unsigned char* GetBuffData()
{
return m_pBuff;
}
~PbData()
{
if (m_pBuff != nullptr)
{
delete[] m_pBuff;
}
m_pBuff = nullptr;
m_buffLen = 0;
}
private:
unsigned char * m_pBuff;
unsigned int m_buffLen;
unsigned int m_contentLen;
};
3.2序列化与反序列化
序列化:
PlatOrderCreate obj;
AtxPlatOrderCreate p = (AtxPlatOrderCreate)atxHead.data;
obj.set_sysquoteid(p->sysQuoteId);
obj.set_clorderid(p->clOrderId);
obj.set_sysorderid(p->sysOrderId);
obj.set_symbol(p->symbol);
obj.set_markettype((int)p->marketType);
obj.set_orderqty(p->orderQty);
obj.set_ordertype((int)p->orderType);
obj.set_orderpx(p->orderPx);
obj.set_side((int)p->side);
obj.set_openclose((int)p->openClose);
obj.set_transactime(p->transacTime);
obj.set_securitytype((int)p->securityType);
obj.set_algoid(p->algoId);
pbData.SetBuffSize(obj.ByteSize());
obj.SerializeToArray((void*)(pbData.GetBuffData()), pbData.GetContentLen());
反序列化:
atxHead.itemByte = sizeof(AtxPlatOrderCreate);
PlatOrderCreate obj;
obj.ParseFromArray((const void*)pStr, len);
atxHead.itemCount = 1;
atxHead.data = new unsigned char[atxHead.itemByte];
AtxPlatOrderCreate p = (AtxPlatOrderCreate)atxHead.data;
memset(p, 0, sizeof(AtxPlatOrderCreate));
p->sysQuoteId = obj.sysquoteid();
strncpy(p->clOrderId, obj.clorderid().c_str(), __min(sizeof(p->clOrderId) - 1, obj.clorderid().length()));
p->sysOrderId = obj.sysorderid();
strncpy(p->symbol, obj.symbol().c_str(), __min(sizeof(p->symbol) - 1, obj.symbol().length()));
p->marketType = (AtxMarketType)obj.markettype();
p->orderQty = obj.orderqty();
p->orderType = (AtxOrderPriceType)obj.ordertype();
p->orderPx = obj.orderpx();
p->side = (AtxSide)obj.side();
p->openClose = (AtxPositionEffectType)obj.openclose();
p->transacTime = obj.transactime();
p->securityType = (AtxSecurityType)obj.securitytype();
p->algoId = obj.algoid();
3.2.1Pb与结构体互转
1.protobuf 转 struct
// @brief : protobuf 转 struct
// @function : AlgoMsgPbParse::ProtoBuf2Struct
// @param : const char * pStr
// @param : int len
// @param : AtxHead & atxHead
// @return : void
// @retval :
// @remark : 1-请求包,2-应答包,9-主推包
// @date : 2020/12/11
static void ProtoBuf2Struct(const char* pStr, int len, AtxHead& atxHead);
2.struct 转 protobuf
// @brief : struct 转 protobuf
// @function : AtxAlgoParse::AlgoMsgPbParse::Struct2ProtoBuf
// @param : const AtxHead & atxHead
// @param : PbData & pbData
// @return : int
// @retval :
// @remark :
// @date : 2020/12/11
static int Struct2ProtoBuf(const AtxHead& atxHead, PbData& pbData);