也许这是一个琐碎的问题,但是...
我有一个平面缓冲区架构,该架构定义了一些消息(表)。
enum EMessages : int
{
E_MSG_EVENT_SYSTEM_INFO = 0x8000,
E_MSG_EVENT_SYSTEM_ERROR = 0x8001,
}
table TMsgHeader
{
sessionRef : int;
transactionId : int;
status : EStatus;
source_id : string;
}
table MSG_EVENT_SYSTEM_INFO
{
opcode : EMessages = E_MSG_EVENT_SYSTEM_INFO;
header : TMsgHeader;
protocol_ver : int = 100;
}
table MSG_EVENT_SYSTEM_ERROR
{
opcode : EMessages = E_MSG_EVENT_SYSTEM_ERROR;
header : TMsgHeader;
error_no : int;
error_desc : string;
}
在接收端,我需要一种方法来检索OpCode字段以了解哪个消息(反序列化)。
原因是,由于每条消息都有不同的大小,因此OpCode字段永远不会在发送的二进制缓冲区中位于同一位置。
FlatBuffer是否有一些“最佳实践”?
我想避免将FB有效负载封装到另一条附加OpCode的消息中。
答案 0 :(得分:1)
您最好使用内置的联合功能,例如:
union Message { Info, Error }
table Info { protocol_ver:int }
table Error { error_no:int; error_string:string }
table Header { msg:Message; /* all other header fields go here */ }
root_type Header
请参阅有关如何序列化和读取联合的文档。以前的opcode
现在是msg_type
。