如何在javascript

时间:2017-05-30 07:21:43

标签: javascript flatbuffers

我正在向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必须内联序列化。'

这是结构:

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

1 个答案:

答案 0 :(得分:1)

错误指的是结构必须在线存储的事实,即它们的字节必须在startMessageAckendMessageAck之间写入缓冲区。你不能引用存储在别处的结构。

你应该能够在不使用中间Uint8ArrayDataView的情况下复制现有的结构,但是,某些内容(未经测试):

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

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

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