자바

2017-12-01 9 views
0

에서 부모로 인코딩 된 flatbuffer 테이블을 추가 I 다음 flatbuffer 스키마가 있습니다자바

table Image { 
    ... 
}  

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

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

가 나는 flatbuffer 객체를 인코딩하는 방법을 이해합니다.

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)); 

하지만 내가하고 싶은 것이 :

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(); 

는 또한, 내가 부모 클래스에 포즈를 "추가"하는 방법을 이해 : 예를 들어, 바이트 배열로 Pose 객체를 인코딩합니다 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... 
} 

내가 같은 느낌을 이러한 추가 할당을 피하는 더 좋은 방법이 있어야합니다. 자식이 이미 인코딩 된 경우 부모 개체를 직접 만들 수있는 방법이 있습니까?

답변

1

현재 API에서이를 직접 수행 할 방법이 없습니다. 확실히 이론적으로는 가능합니다. 부모 버퍼에 바이트를 추가 한 다음 부모 생성자에 오프셋을 전달합니다. 그래도 FlatBufferBuilder에 새로운 기능이 필요합니다.