如何在 javascript 中使用现有结构缓冲区构建平面缓冲区消息

How to build flatbuffers message with existing struct buffer in javascript

我正在向 Node.js 服务器中收到的消息发送确认,我想将 messageId 回显给客户端。目前我正在将 messageId 从缓冲区解析为字符串并从字符串构建 ack。将 id 解析为字符串并返回是不必要的,但我无法直接使用 stuct 缓冲区构建 ack。

当 messageid 作为字符串传入时,它是这样工作的。

function createAck(messageId) {
    let builder = new flatbuffers.Builder;
    const request = MyServer.MessageAck;

    request.startMessageAck(builder);
    request.addMessgeId(builder, createUUID(builder, messageId));
    const requestMessage = request.endMessageAck(builder);

    return builder.finish(requestMessage);
}

function createUUID(builder, messageId) {
    let uuidBytes = new Uint8Array(uuidParse.parse(messageId));
    let dataview = new DataView(uuidBytes.buffer);

    return MyServer.UUID.createUUID(builder,
        flatbuffers.Long.create(dataview.getInt32(0, true), dataview.getInt32(4, true)),
        flatbuffers.Long.create(dataview.getInt32(8, true), dataview.getInt32(12, true)));
}

我想将 messageId 作为直接从消息中获取的缓冲区传入

request.addMessgeId(builder, messageId);

但我收到一个错误:'FlatBuffers: struct must be serialized inline.'

结构如下:

struct UUID {
    low_bytes: ulong;
    high_bytes: ulong;
}

错误是指结构必须以内嵌方式存储,即它们的字节必须写入 startMessageAckendMessageAck 之间的缓冲区。您不能引用存储在别处的结构。

您应该能够在不使用中间结构 Uint8ArrayDataView 的情况下复制现有结构,但是,有些东西类似于(未测试):

request.addMessgeId(builder, MyServer.UUID.createUUID(builder,
    messageId.low_bytes(), messageId.high_bytes());

假设 messageId 是对传入 UUID 结构的引用,无法从您的代码中分辨出来。

如果您可以使用等效于 C memcpy 的 JS 复制结构,那就更好了,但这需要直接在 builder 中的 ByteBuffer 上进行一些黑客攻击当前 API 不直接支持,因此仅 2 个字段可能不值得。