java - 在 Java 中将编码的 FlatBuffers 表添加到父级

标签 java flatbuffers

我有以下 FlatBuffers 架构:

table Image {
    ...
}    

table Pose {
    r:[double] (required);
    q:[double] (required);
}

table StampedImage {
    pose: Pose (required);
    image: Image (required);
}

我了解如何对 FlatBuffers 对象进行编码。例如,要将 Pose 对象编码为字节数组:

    double[] r = ...
    double[] q = ...
    FlatBufferBuilder fbb = new FlatBufferBuilder();
    int rvec = Pose.createRVector(fbb, r);
    int qvec = Pose.createQVector(fbb, q);
    Pose.startPose(fbb);
    Pose.addR(fbb, rvec);
    Pose.addQ(fbb, qvec);
    Pose.finishPoseBuffer(fbb, Pose.endPose(fbb));
    byte[] encodedPose = fbb.sizedByteArray();

此外,我了解如何向父类“添加”姿势:

    FlatBufferBuilder fbb = new FlatBufferBuilder();

    int rOff = Pose.createRVector(fbb, r);
    int qOff = Pose.createQVector(fbb, q);
    Pose.startPose(fbb);
    Pose.addR(fbb, rOff);
    Pose.addQ(fbb, qOff);
    int poseOff = Pose.endPose(fbb);

    // Create the image
    int imageOff = ...

    StampedImage.startStampedImage(fbb);
    StampedImage.addPose(fbb, poseOff);
    StampedImage.addImage(fbb, imageOff);
    fbb.finish(StampedImage.endStampedImage(fbb));

但我想做的是将 encodedPose 数据直接添加到父 StampedImage 中。我的用例是,我正在建立一个企业集团......我从一个源接收姿势数据作为编码字节数组,并从另一个源接收图像数据(也作为编码字节数组)。所以我希望能够将这些对象“组合”成一个编码对象。例如,函数签名如下所示:

public byte[] encodeStampedImage( byte[] encodedPose, byte[] encodedImage ){
    .... ?????
}

一种方法是解码对象,然后重新编码它们,但这会产生巨大的开销:

public byte[] encodeStampedImage( byte[] encodedPose, byte[] encodedImage ){
    Pose pose   = Pose.getRootAsPose(   ByteBuffer.wrap(encodedPose ));
    Image image = Image.getRootAsImage( ByteBuffer.wrap(encodedImage));
    // Get r and q vectors from pose, then add them 

    FlatBufferBuilder fbb = new FlatBufferBuilder();

    int rOff = Pose.createRVector(fbb, pose.rAsByteBuffer().array());
    int qOff = Pose.createRVector(fbb, pose.qAsByteBuffer().array());
    // Proceed as before... 
}

我觉得必须有更好的方法来避免这些额外的分配。如果子对象已经编码,是否有某种方法可以直接从它们创建父对象?

最佳答案

目前没有直接的方法可以在 API 中执行此操作。这当然是可能的,而且理论上很简单:您只需将子缓冲区的字节添加到父缓冲区,然后将其偏移量传递给父构造函数。但这需要 FlatBufferBuilder 中的一个新函数。

关于java - 在 Java 中将编码的 FlatBuffers 表添加到父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47595534/

相关文章:

http - Flatbuffers 的 MIME 类型?

c++ - Flatbuffers 没有生成 Get* 方法,但是生成了 *Builder(在 C++ 中)?

javascript - 如何使用 nbind 包装由 FlatBuffers 编译器生成的 C++ gRPC 接口(interface)作为 Javascript/Typescript 接口(interface)?

java - 当 JSON 没有变量名时使用 gson 反序列化

java - Morphlines Java自定义命令类在哪里存储?

java - 一起使用 Neo4j Core Java API 和终端控制台

flatbuffers - 有效地清除表层的 FlatBuffers 构建器

java - Java keystore 中的中间 CA 证书

java - 是否可以使用 appengine 模块和云端点?

c++ - FlatBuffers 的多语言集成问题