You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 19:47:29