如何从平面缓冲区模式中的任何 table 检索字段

How to retrieve field from any table in a flatbuffer schema

也许这是一个微不足道的问题,但是...
我有一个平面缓冲区模式,它定义了一些消息(表)。

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 字段永远不会在发送的二进制缓冲区中的相同位置。

是否有一些"best practice"应用于FlatBuffer?

我想避免将 FB 负载封装到附加 OpCode 的另一条消息中。

您最好使用内置的联合功能,例如:

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