FlatBuffers向量能否添加空位?无需修改Item表的技术问询
问题:FlatBuffers向量中能否设置空位/空元素?
我需要传输一个长度可变的项目列表,项目的位置具有重要意义,但部分项目可省略,且现有项目需保持正确位置。假设定义如下Schema:
table Item { value:string; } table List { items:[Item]; } root_type List;
创建Buffer的代码如下,但执行fbb.CreateVector方法时程序崩溃:
void createBuffer() { auto fbb = ::flatbuffers::FlatBufferBuilder{}; auto vector = std::vector<::flatbuffers::Offset<Item>>{}; vector.push_back(CreateItem(fbb, fbb.CreateString("Test"))); // 尝试添加"空"元素 vector.push_back({}); auto fVector = fbb.CreateVector(vector); auto list = CreateList(fbb, fVector); fbb.Finish(list); }
请问无需修改Item表的前提下,是否有办法为该向量添加空位?
回答
FlatBuffers的向量不允许包含无效的空Offset(即值为0的Offset<Item>),CreateVector会校验每个元素的有效性,直接插入默认构造的空Offset会触发崩溃。
无需修改Item表的前提下,有一个简单可行的方案:
创建空Item实例作为占位符
Item表的value字段是FlatBuffers默认的可选字段,因此可以创建一个不含任何字段的空Item作为占位,这样生成的Offset是有效的,不会触发崩溃:
修改后的代码:
void createBuffer() { auto fbb = ::flatbuffers::FlatBufferBuilder{}; auto vector = std::vector<::flatbuffers::Offset<Item>>{}; vector.push_back(CreateItem(fbb, fbb.CreateString("Test"))); // 创建空Item作为占位 vector.push_back(CreateItem(fbb)); auto fVector = fbb.CreateVector(vector); auto list = CreateList(fbb, fVector); fbb.Finish(list); }
解析时,通过判断Item的value()是否为空(或调用value_is_null()方法),即可区分真实元素和占位的空位。
内容的提问来源于stack exchange,提问作者king_nak
相关产品推荐
相关产品推荐

