2017-05-30 65 views
0

我正在向Node.js服务器中的收到消息发送ack消息,并且想要将messageId回显给客户端。目前,我正在将缓冲区的messageId解析为字符串,并从字符串构建ack。将id解析为字符串并返回是不必要的,但我无法直接使用stuct缓冲区构建ack。如何在javascript中使用现有结构缓冲区创建flatbuffers消息

这是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; 
} 

回答

1

该错误是指这样的事实:结构必须被存储在在线,即它们的字节必须被写入到缓冲器中startMessageAckendMessageAck之间。你不能引用其他地方存储的结构。

您应该能够对现有的结构沿着线(未测试)复制,而不使用中间Uint8ArrayDataView然而,事:

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

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

更妙的是,如果你能复制使用JS相当于Çmemcpy的结构,但是这将直接对需要在builder当前API不直接支持ByteBuffer一些两轮牛车,所以很可能是不值得它只有2个领域。

+0

谢谢,是的,这工作(稍作修改),是一个更好的步骤:'request.addMessageId(builder,MyServer.UUID.createUUID(builder,messageId.lowBytes(),messageId.highBytes())); ' – Mikko