我正在向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;
}
答案 0 :(得分:1)
错误指的是结构必须在线存储的事实,即它们的字节必须在startMessageAck
和endMessageAck
之间写入缓冲区。你不能引用存储在别处的结构。
你应该能够在不使用中间Uint8Array
和DataView
的情况下复制现有的结构,但是,某些内容(未经测试):
request.addMessgeId(builder, MyServer.UUID.createUUID(builder,
messageId.low_bytes(), messageId.high_bytes());
假设messageId
是对传入的UUID
结构的引用,则无法从您的代码中判断出来。
如果您可以使用等效于C memcpy
的JS复制结构,那就更好了,但这需要直接在当前API的ByteBuffer
builder
上使用一些hackery不直接支持,因此仅仅2个字段可能不值得。