2

如果这两个对象的模式中的表从相似的数据类型开始,是否有任何方法可以使用 flatbuffer 验证器验证其中包含 flatbuffer 结构的字节数组?

示例架构:

table AddTaskResponse{
    blablabla:int;
    foobar:int;
}

table AddTaskRequest{
    requestId:int;
    taskId:int;
    profileId:string;
}

我目前的实验告诉我:

flatbuffers::Verifier verifier(reinterpret_cast<unsigned char*>(data.data()),data.size());
bool isaddTaskResponse = VerifyAddTaskResponseBuffer(verifier);
bool isaddTaskRequest = VerifyAddTaskRequestBuffer(verifier);

两个布尔标志 isaddTaskResponse 和 isaddTaskRequest 都是真的,它们的真实状态不取决于我发送的实际结构AddTaskResponseAddTaskRequest

4

1 回答 1

4

验证器只是检查数据结构是否合理(没有偏移量超出范围),但是缓冲区中没有关于类型的数据,所以是的,如果类型兼容,它将起作用。

在这种情况下,如果响应验证器看到一个请求缓冲区,它会认为它是来自未来版本的模式的缓冲区(它有一个额外的字段,会被忽略)。类似地,如果请求验证器看到响应缓冲区,它认为它得到了旧版本的模式,因为缺少一个字段。

虽然这可行,但不建议这样做,因为它会使模式演变复杂化,并且您正在对实现做出一些假设。您应该始终知道缓冲区的确切类型,无论是通过外部上下文还是内部(例如使用联合类型)。

于 2016-05-27T16:18:59.627 回答