以任何方式确定收到的架构类型

时间:2016-02-14 20:18:47

标签: java flatbuffers

我有以下两种模式。我通过套接字发送数据;接收时有没有办法确定哪一个被发送?

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分: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")
    }