将编码的平面缓冲区 table 添加到 Java 中的 parent
Add an encoded flatbuffer table to a parent in Java
我有以下平面缓冲区架构:
table Image {
...
}
table Pose {
r:[double] (required);
q:[double] (required);
}
table StampedImage {
pose: Pose (required);
image: Image (required);
}
我了解如何对平面缓冲区进行编码 object。例如,将 Pose
object 编码为字节数组:
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();
此外,我了解如何"add" 摆姿势 parent class:
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
数据添加到 parent StampedImage
。我的用例是我正在建立一个集团......我从一个来源接收姿势数据作为编码字节数组,并从另一个来源接收图像数据(也作为编码字节数组)。所以我希望能够将这些"combine"这些object变成一个单独编码的object。例如,函数签名如下所示:
public byte[] encodeStampedImage( byte[] encodedPose, byte[] encodedImage ){
.... ?????
}
一种方法是对 object 进行解码,然后对其重新编码,但这会产生巨大的开销:
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...
}
我觉得必须有更好的方法来避免这些额外的分配。如果 children 已经编码,是否有一些方法可以直接从它们创建 parent object?
目前在 API 中没有直接的方法可以做到这一点。这当然是可能的,并且理论上很简单:您只需将子缓冲区的字节添加到父缓冲区,然后将其偏移量传递给父构造函数。不过,这需要 FlatBufferBuilder
中的新函数。
我有以下平面缓冲区架构:
table Image {
...
}
table Pose {
r:[double] (required);
q:[double] (required);
}
table StampedImage {
pose: Pose (required);
image: Image (required);
}
我了解如何对平面缓冲区进行编码 object。例如,将 Pose
object 编码为字节数组:
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();
此外,我了解如何"add" 摆姿势 parent class:
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
数据添加到 parent StampedImage
。我的用例是我正在建立一个集团......我从一个来源接收姿势数据作为编码字节数组,并从另一个来源接收图像数据(也作为编码字节数组)。所以我希望能够将这些"combine"这些object变成一个单独编码的object。例如,函数签名如下所示:
public byte[] encodeStampedImage( byte[] encodedPose, byte[] encodedImage ){
.... ?????
}
一种方法是对 object 进行解码,然后对其重新编码,但这会产生巨大的开销:
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...
}
我觉得必须有更好的方法来避免这些额外的分配。如果 children 已经编码,是否有一些方法可以直接从它们创建 parent object?
目前在 API 中没有直接的方法可以做到这一点。这当然是可能的,并且理论上很简单:您只需将子缓冲区的字节添加到父缓冲区,然后将其偏移量传递给父构造函数。不过,这需要 FlatBufferBuilder
中的新函数。