确定接收到哪种模式的任何方法

Any way to determine what kind of schema was received

我有以下两个模式。我通过套接字发送数据;收到后有什么方法可以确定发送的是哪一个?

namespace Objects;
    table Login {
      email:string;
      password:string;
    }

    root_type Login;
    file_identifier "LOGN";

namespace Objects;
    table Register{
      email:string;
      password:string;
    }

    root_type Register;
    file_identifier "REGR";

在一般情况下,不,FlatBuffers 是强类型的(不是自描述的),所以你必须知道你接收的是什么。

但是正如您的问题已经表明的那样,标记 FlatBuffer 二进制文件的一种便捷方法是使用 file_identifier。您可以使用 BufferHasIdentifier 或任何生成的同名函数对其进行测试。

发送各种消息的更好解决方案是使用合并功能。

我找到了解决办法。

只是制定一个规则,int16 变量总是在每个数据包的顶部。像这样,

    namespace Packets;
    table Packet1 {
      id:int16;
      text1:string;
    }

    table Packet2 {
      id:int16;
      cost:int32;
      text:string;
    }

然后你可以从 bytes

中获取第一个 int16 值

golang 示例

    tPos := flatbuffers.GetUOffsetT(packetBytes)
    offset := flatbuffers.UOffsetT(flatbuffers.SOffsetT(tPos) - flatbuffers.GetSOffsetT(packetBytes[tPos:]))
    offset = flatbuffers.UOffsetT(4) + offset
    o := flatbuffers.UOffsetT(flatbuffers.GetVOffsetT(packetBytes[offset:]))
    pos := tPos + o
    id := flatbuffers.GetInt16(packetBytes[pos:])

    switch id {
      case 1:
        fmt.Println("packet1")
      case 2:
        fmt.Println("packet2")
    }