代码之家  ›  专栏  ›  技术社区  ›  DP Greveling

为什么FlatBufferBuilder如此。dataBuffer返回与java.nio.ByteBuffer.wrap不同的缓冲区?

  •  1
  • DP Greveling  · 技术社区  · 8 年前

    我试图通过网络将float从windows上用c#编写的程序发送到使用flatbuffers用java编写的android应用程序。

    使用java.nio.ByteBuffer.wrap从android应用程序中接收的字节构建缓冲区。从该缓冲区反序列化Example对象。然而,这会导致每个浮点值都设置为0。

    在下面的示例中显示了此行为。

    为什么“example2”返回值 0.0 而不是 20.0 ?

    这是我使用的模式:

    // Example IDL file for our monster's schema.
    namespace MyGame.Sample;
    table Example {
      myFloat:float;
    }
    root_type Example;
    

    这是显示行为的java代码:

    //The float
    float myFloat = 20.0f;
    
    FlatBufferBuilder builder = new FlatBufferBuilder(0);
    
    //Build the example
    Example.startExample(builder);
    Example.addMyFloat(builder, myFloat);
    int exampleInt = Example.endExample(builder);
    
    builder.finish(exampleInt);
    
    java.nio.ByteBuffer buf = builder.dataBuffer();
    
    Example example = Example.getRootAsExample(buf);
    
    System.out.println("1: Myfloat: " + example.myFloat());
    
    byte[] bytesBuf = buf.array();
    Example example2 = Example.getRootAsExample(java.nio.ByteBuffer.wrap(bytesBuf));
    
    System.out.println("2: Myfloat: " + example2.myFloat());
    

    输出:

    System.out: 1: Myfloat: 20.0
    System.out: 2: Myfloat: 0.0
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Aardappel    8 年前

    array()获取原始的underlyimg缓冲区,其中包含偏移量可能不是0的FlatBuffer。相反,FlatBufferBuilder中有一个方法(它的名字现在我不知道了)可以获取缓冲区。