0

我正在向 Node.js 服务器中收到的消息发送 ack,并且我想将 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 UUID {
    low_bytes: ulong;
    high_bytes: ulong;
}
4

1 回答 1

1

错误是指结构必须以内联方式存储,即它们的字节必须写入 和 之间的startMessageAck缓冲区endMessageAck。您不能引用存储在其他地方的结构。

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

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

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

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

于 2017-05-30T14:59:06.970 回答