我正在向 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;
}
最佳答案
该错误是指结构必须内联存储,即它们的字节必须写入 startMessageAck
和 endMessageAck
之间的缓冲区。您无法引用存储在其他地方的结构。
您应该能够在不使用中间 Uint8Array
和 DataView
的情况下复制现有结构,但是,类似于(未测试):
request.addMessgeId(builder, MyServer.UUID.createUUID(builder,
messageId.low_bytes(), messageId.high_bytes());
假设 messageId
是对传入 UUID
结构的引用,无法从您的代码中得知。
如果您可以使用相当于 C memcpy
的 JS 来复制该结构,那就更好了,但这需要直接在 中的
,因此仅 2 个字段可能不值得。ByteBuffer
上进行一些黑客操作。当前 API 不直接支持的构建器
关于javascript - 如何使用 JavaScript 中现有的结构缓冲区构建 Flatbuffers 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44255967/