У меня следующая схема плоского буфера:
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...
}
Я чувствую, что должен быть лучший способ избежать этих дополнительных распределений. Если дочерние элементы уже закодированы, нет ли способа напрямую создать из них родительский объект?