javascript - 如何使用 JavaScript 中现有的结构缓冲区构建 Flatbuffers 消息

标签 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 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 来复制该结构,那就更好了,但这需要直接在 中的 ByteBuffer 上进行一些黑客操作。当前 API 不直接支持的构建器,因此仅 2 个字段可能不值得。

关于javascript - 如何使用 JavaScript 中现有的结构缓冲区构建 Flatbuffers 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44255967/

相关文章:

c++ - ZeroMQ C++ 上的简单 FlatBuffer 示例 - 通过 zmq 将结构复制到 flatbuffer 并再次返回结构

c++ - Protobuf vs Flatbuffers vs Cap'n proto哪个更快?

javascript - 在本地提供 Google No Captcha reCaptcha 的 api.js 是否会阻止正确的行为?

json - Swift:解析 10k 行数据的最高效方法?

javascript - 检查嵌套键是否存在,即使未定义

javascript - 如何避免多次追加

c++ - 在 C++ 中读取通过 ZMQ 发送的 Flatbuffers 对象会引发未处理的异常

java - Java 中使用 Flatbuffers 进行字符串去重

javascript - 在 setState() 之后更新的状态不会作为 props 传递给组件

javascript - 如何用javascript通过点击来改变背景颜色?