1

私はFlatBuffers Javascript チュートリアルに従っていますが、非スカラー項目のベクトルを次のオブジェクトに追加する際に問題があります:

namespace test;

enum Availability : byte {
  Unavailable = 0,
  Available = 1
}

table Channel {
  channelNumber:uint;
  myState:Availability = Unavailable;
}

table ControlChannel {
  channels:[Channel];
}

root_type ControlChannel; 

ご覧のとおり、ルート オブジェクトにはChannelオブジェクトのベクトルが含まれています。JavaScript コードは正常に生成されましたが、テスト データを作成しようとすると、チャネルが正しく追加されていないようです。これは私が試したものです:

const fs = require('fs');
const flatbuffers = require('./flatbuffers').flatbuffers;
const test = require('./control-channel_generated').test;

// Create builder. The '1' is the 'initial size', whatever that means.
const builder = new flatbuffers.Builder(1);

// Create the first channel
test.Channel.startChannel(builder);
test.Channel.addChannelNumber(builder, 1);
const channel1 = test.Channel.endChannel(builder);

// Create another channel
test.Channel.startChannel(builder);
test.Channel.addChannelNumber(builder, 2);
test.Channel.addMyState(builder, test.Availability.Available);
const channel2 = test.Channel.endChannel(builder);

// Create a vector of the channels
const chans = [channel1, channel2];
const channels = test.ControlChannel.createChannelsVector(builder, chans);

// Create control channel and add the channels
test.ControlChannel.startControlChannel(builder);
test.ControlChannel.addChannels(builder, channels); // The resulting cc-test.data file is the same whether I comment this line or not
const controlChannel = test.ControlChannel.endControlChannel(builder);

// Control channel is finished
builder.finish(controlChannel);

// Create a buffer (to send it, write it etc)
const buf = builder.asUint8Array();
fs.writeFileSync('cc-test.data', buf);
console.log(`Data written to 'cc-test.data'.`);

これにより、バッファを含むファイルが呼び出さcc-test.dataれ、追加しようとするチャネルの数に関係なく、バッファは常にまったく同じになります。また、次のようにデータを解析してみました。

const fs = require('fs');
const flatbuffers = require('./flatbuffers').flatbuffers;
const test = require('./control-channel_generated').test;

// Parse the data as a new byte array
const data = new Uint8Array(fs.readFileSync('./cc-test.data'));
const buf = new flatbuffers.ByteBuffer(data);

// This is where all the magic happens
const controlChannel = test.ControlChannel.getRootAsControlChannel(buf);

// You can not iterate over the channels directly, you have to get it by index
console.log(`ControlChannel has ${controlChannel.channelsLength()} channels:`);

for (var i = 0; i < controlChannel.channelsLength(); i++) {
  const channel = controlChannel.channels(i);
  console.log(`Channel ${channel.channelNumber()} (Available: ${channel.myState()})`);
}

これは、毎回ControlChannel has 0 channels を出力するだけです。私は何が欠けていますか?

4

0 に答える 0