Flatbuffers 验证器行为
Flatbuffers verifier behaviour
如果两个对象的模式中的表从相似的数据类型开始,是否有任何方法可以使用平面缓冲区验证程序验证其中具有平面缓冲区结构的字节数组?
示例架构:
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 均为真,它们的真实状态不取决于我发送的实际结构 AddTaskResponse
或 AddTaskRequest
。
验证器只是检查数据在结构上是否合理(没有偏移量超出范围),但是缓冲区中没有关于类型的数据,所以是的,如果类型兼容,它将起作用。
在这种情况下,如果响应验证器看到请求缓冲区,它会认为它是未来版本模式的缓冲区(它有一个额外的字段,被忽略)。同样,如果请求验证器看到响应缓冲区,它认为它得到了旧版本的模式,因为缺少一个字段。
虽然这可行,但不推荐这样做,因为它会使模式演变复杂化,并且您要对实现做出一些假设。您应该始终通过外部上下文或内部(例如使用联合类型)知道缓冲区的确切类型。
如果两个对象的模式中的表从相似的数据类型开始,是否有任何方法可以使用平面缓冲区验证程序验证其中具有平面缓冲区结构的字节数组?
示例架构:
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 均为真,它们的真实状态不取决于我发送的实际结构 AddTaskResponse
或 AddTaskRequest
。
验证器只是检查数据在结构上是否合理(没有偏移量超出范围),但是缓冲区中没有关于类型的数据,所以是的,如果类型兼容,它将起作用。
在这种情况下,如果响应验证器看到请求缓冲区,它会认为它是未来版本模式的缓冲区(它有一个额外的字段,被忽略)。同样,如果请求验证器看到响应缓冲区,它认为它得到了旧版本的模式,因为缺少一个字段。
虽然这可行,但不推荐这样做,因为它会使模式演变复杂化,并且您要对实现做出一些假设。您应该始终通过外部上下文或内部(例如使用联合类型)知道缓冲区的确切类型。