代码之家  ›  专栏  ›  技术社区  ›  Barzo

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

  •  0
  • Barzo  · 技术社区  · 6 年前

    也许这是个小问题,但是…
    我有一个定义了一些消息(表)的flatbuffer模式。

    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;
    }
    

    在接收端,我需要一种方法来检索操作码字段,以知道哪个消息是(对其进行反序列化)。
    因为,由于每条消息的大小都不同,所以在发送的二进制缓冲区上,操作码字段永远不在同一位置。

    是否有一些“最佳实践”适用于FlatBuffer?

    我想避免将FB有效载荷封装到另一个附加操作码的消息中。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Aardappel    6 年前

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

    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 .