Добавить закодированную таблицу плоского буфера к родительскому элементу в Java

У меня следующая схема плоского буфера:

table Image {
    ...
}    

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

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

Я понимаю, как кодировать объект плоского буфера. Например, чтобы закодировать объект 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... 
}

Я чувствую, что должен быть лучший способ избежать этих дополнительных распределений. Если дочерние элементы уже закодированы, нет ли способа напрямую создать из них родительский объект?


person bremen_matt    schedule 01.12.2017    source источник


Ответы (1)


В настоящее время в API нет прямого способа сделать это. Это, безусловно, возможно и теоретически просто: вы просто добавляете байты дочернего буфера к родительскому, а затем передаете смещение к нему родительскому конструктору. Однако для этого потребуется новая функция в FlatBufferBuilder.

person Aardappel    schedule 01.12.2017