FlatBuffers BufferHasIdentifier return false

本文关键字:false return BufferHasIdentifier FlatBuffers | 更新日期: 2023-09-27 18:35:17

我正在尝试使用Flatbuffers通过TCP传输数据,服务器是java,但客户端是C#,这使它变得非常复杂。

我使用的架构是:

namespace NetObjects;
union NetParameters { NetLogin, NetRegister }
table NetMessage {
  parameters:NetParameters;
}
table NetLogin{
    id: int;
    email:string;
    password:string;
}
table NetRegister{
    id: int;
    email:string;
    password:string;
}
root_type NetMessage;
file_identifier "MESG";

我如何发送它 c#:

 FlatBufferBuilder fbb = new FlatBufferBuilder(1);
            String buffer = "EMAILCHE";
            StringOffset id = fbb.CreateString(buffer);
            StringOffset idd = fbb.CreateString("PasswordO?");
            NetLogin.StartNetLogin(fbb);
            NetLogin.AddEmail(fbb, id);
            NetLogin.AddPassword(fbb, idd);
            Offset<NetLogin> offset = NetLogin.EndNetLogin(fbb);
            NetMessage.StartNetMessage(fbb);
            NetMessage.AddParametersType(fbb, NetParameters.NetRegister);
            NetMessage.AddParameters(fbb, offset.Value);
            Offset<NetMessage> par = NetMessage.EndNetMessage(fbb);
            NetMessage.FinishNetMessageBuffer(fbb, par);
            _socket.Send(fbb.DataBuffer.Data, 0, fbb.DataBuffer.Data.Length, SocketFlags.None);

我如何接收它 java:

DataInputStream in = new DataInputStream(new BufferedInputStream(clientSocket.getInputStream()));
try (ByteArrayOutputStream os = new ByteArrayOutputStream())
                {
                    byte[] buffer = new byte[0xFFFF];
                    for (int len; (len = in.read(buffer)) != -1;) {
                        os.write(buffer, 0, len);
                        os.flush();
                        Handle(os.toByteArray());
                        System.out.println("Step: " + 4);
                    }
                }

处理:

public void Handle(byte[] bytes){
        ByteBuffer bff = ByteBuffer.wrap(bytes);
        NetMessage.NetMessageBufferHasIdentifier(bff); // ALWAYS FALSE IS RETURNED
        NetMessage lg = NetMessage.getRootAsNetMessage(bff);
        System.out.println(lg.parametersType()); // 0 is returned
}

FlatBuffers BufferHasIdentifier return false

_socket.Send(fbb.DataBuffer.Data, fbb.Offset, fbb.DataBuffer.Data.Length,  SocketFlags.None);