如何从FlatBuffer模式中的任何表中检索字段

时间:2018-07-18 15:46:03

标签: c# flatbuffers

也许这是一个琐碎的问题,但是...
我有一个平面缓冲区架构,该架构定义了一些消息(表)。

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的消息中。

1 个答案:

答案 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