我有一个message的flatbuffer模式:

table NodeConstructionInfo {
    type:string (id: 0, required);
    name:string (id: 1, required);
}

table AddNodeRequest {
    graphId:string (id:0, required);
    node:NodeConstructionInfo (id:1, required);
}

我在TypeScript中构造(写入)并在C++中接收(读取)的代码:
let builder = new flatbuffers.Builder(356);
let offGraphId = builder.createString("2992ebff-c950-4184-8876-5fe6ac029aa5");
let offType = builder.createString("MySuperDuperNode");
let offName = builder.createString("DummyNode");

sz.NodeConstructionInfo.startNodeConstructionInfo(builder);
sz.NodeConstructionInfo.addName(builder, offName);
sz.NodeConstructionInfo.addType(builder, offType);
let off = sz.NodeConstructionInfo.endNodeConstructionInfo(builder);

sz.AddNodeRequest.startAddNodeRequest(builder);
sz.AddNodeRequest.addGraphId(builder, offGraphId);
sz.AddNodeRequest.addNode(builder, off);
off = sz.AddNodeRequest.endAddNodeRequest(builder);
builder.finish(off);

let requestPayload = builder.asUint8Array();

在C++中,我收到356个字节(requestPayload),并尝试通过以下操作进行验证
flatbuffers::Verifier v(buffer.getData(), buffer.getSize());
v.VerifyBuffer<AddNodeRequest>();

总是在<flatbuffers/flatbuffers.h>中失败:
template<typename T>
bool VerifyBufferFromStart(const char *identifier, const uint8_t *start)
{
   ...
   // Call T::Verify, which must be in the generated code for this type.
   auto o = VerifyOffset(start); <--- HERE (the first read flatbuffers::uoffset_t should not be 0 (don't know why)?)
   ...
}

我是否缺少一些重要的细节?
缓冲区看起来像
PostData received:

'\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,
\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,
\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,
\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,
\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,
\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,
\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,
\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,
\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,
\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,
\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,\x00,
\x00,\f,\x00,\x00,\x00,\b,\x00,\f,\x00,\b,\x00,\x04,\x00,\b,\x00,\x00,\x00,\x10,\x00,\x00,\x00,@,\x00,\x00,
\x00,\b,\x00,\f,\x00,\x04,\x00,\b,\x00,\b,\x00,\x00,\x00, ,\x00,\x00,\x00,\x04,\x00,\x00,\x00,\x10,\x00,\x00,
\x00,M,y,S,u,p,e,r,D,u,p,e,r,N,o,d,e,\x00,\x00,\x00,\x00,\t,\x00,\x00,\x00,D,u,m,m,y,N,o,d,e,
\x00,\x00,\x00,$,\x00,\x00,\x00,2,9,9,2,e,b,f,f,-,c,9,5,0,-,4,1,8,4,-,8,8,7,6,-,5,f,e,6,a,c,0,2,9,a,a,5,
\x00,\x00,\x00,\x00

使用C++编写的TypeScript读取消息可以工作...(?)
Flatbuffer版本1.9.0

最佳答案

如您的缓冲区转储所示,问题在于它包含很多前导零。 FlatBuffer实际上在构造时可能包含前导零(因为它是在较大的缓冲区中向后构造的),但是asUint8Array通常负责将其修整为所需的数组。因此,或者您实际上没有在实际代码中使用asUint8Array,或者其他代码在零之前添加了零。

09-09 23:23