我有以下两种模式。我通过套接字发送数据;接收时有没有办法确定哪一个被发送?
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";
答案 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")
}