2

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

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";
4

2 回答 2

1

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

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

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

于 2016-02-15T05:39:58.233 回答
0

我找到了解决方案。

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

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

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

然后你可以从字节中获取第一个 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")
    }
于 2019-10-18T05:03:41.353 回答