【问题标题】:FlatBuffers index out of bound exceptionFlatBuffers 索引越界异常
【发布时间】:2016-02-15 21:09:29
【问题描述】:

现在我正在尝试使用 flatbuffers 通过套接字发送数据

架构:

namespace Objects;

union Parameters { Login, Register }

table Message {
  parameters:Parameters;
}

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

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

root_type Message;
file_identifier "MESG";

我的建造者:

FlatBufferBuilder fbb = new FlatBufferBuilder(1);
        FlatBufferBuilder ftb = new FlatBufferBuilder(1);

        String buffer = "EMAILCHE";
        int id = ftb.createString(buffer);

        Login.startLogin(ftb);
        Login.addEmail(ftb, id);
        Login.addPassword(ftb, id);
        int offset = Login.endLogin(ftb);

        Message.startMessage(fbb);

        Message.addParametersType(fbb, Parameters.Login);
        Message.addParameters(fbb, offset);

        int par = Message.endMessage(fbb);

        Message.finishMessageBuffer(fbb, par);

反序列化:

ByteBuffer bff = fbb.dataBuffer();

        Message.MessageBufferHasIdentifier(bff);

        Message lg = Message.getRootAsMessage(bff);


        switch (lg.parametersType()){

            case Parameters.Login:
                Login saveSchema = Login.getRootAsLogin(lg.getByteBuffer());
                System.out.println(saveSchema.email());
                break;
            case Parameters.Register:
                System.out.println("reg");
                break;

        }

在这一行抛出索引越界异常:System.out.println(saveSchema.email()); 完全错误:线程“main”中的异常 java.lang.IndexOutOfBoundsException

【问题讨论】:

    标签: java flatbuffers


    【解决方案1】:

    只使用一个FlatBufferBuilder。您不能从另一个缓冲区引用一个缓冲区中的数据。

    【讨论】:

    • 另外,将Login.getRootAsLogin(lg.getByteBuffer())替换为(Login)lg.parameter()。 getRootAsX 函数仅适用于 FlatBuffer 的根。
    【解决方案2】:

    代替:

    Login saveSchema = Login.getRootAsLogin(lg.getByteBuffer());
                    System.out.println(saveSchema.email());
    

    这个:

    Login saveLogin = new Login();
                    saveLogin = (Login) lg.parameters(saveLogin);
    
                    System.out.println(saveLogin.password());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-19
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 2015-12-08
      • 2011-10-08
      • 2017-03-23
      相关资源
      最近更新 更多