【问题标题】:Is there a recommended pattern for building Flatbuffers that have nested types?是否有推荐的模式来构建具有嵌套类型的 Flatbuffers?
【发布时间】:2020-09-07 03:58:19
【问题描述】:

我有一个包含许多嵌套表的 flatbuffers 架构。在Typescript flatbuffers 中,我能够让每个表公开一个to_offset 函数,该函数在创建时为表返回WIPOffset。然后我可以将结果分配给更高级别类型的嵌套字段,并且效果很好。

在 Rust flatbuffers 中,我无法完成这项工作,因为它需要多个可变借用,这当然是不允许的。

您有什么方法推荐使用像这样的嵌套架构,其中在整个架构中以更高级别的类型使用各种表?

这是我想做的一个粗略的例子:


table A {
  f1: string;
}
    
table B {
  fa: A;
  f2: uint;
}

table C {
  fa: A;
  f3: ushort;
}

fn build_a_offset<'a>(fbb: &'a mut FlatBufferBuilder) -> WIPOffset<A<'a>> {
  let args = AArgs {...
  };

  let a = A::create(fbb, &args);

  a
}

fn build_b_buf() -> Vec<u8> {
  let mut fbb = FlatBufferBuilder::new_with_capacity(1024);
  
  let a_offset = build_a_offset(&mut fbb);

  let b_args = BArgs {
    a: a_offset,
    f2: 30u32,
  }

  let b = B::create(&mut fbb, f_args);

  fbb.finish(b); 

  fbb.finished_data().to_vec()

}

任何关于如何正确构建它的建议都会非常有帮助。

【问题讨论】:

  • 我相信答案是不可能的,一个 FlatBufferBuilder 实例只能被可变地借用一次。我还检查了 Rust Flatbuffers 集成测试,它们的工作方式相同(一个实例有一个借用,除非它是一个循环,然后他们使用重置但仍然只有 1 个借用)。如果我遗漏了什么,请告诉我,否则我会解决这个问题。
  • 当然,FlatBuffers API 允许这样做,其中包含的示例和测试可以做到这一点。你读过google.github.io/flatbuffers/flatbuffers_guide_tutorial.html(选择“Rust”)吗?
  • 我确实阅读了这些示例,但它们并不是我需要做的。我找到了解决方案,它只是以正确的方式使用生命周期。我会发布一个答案。

标签: rust flatbuffers


【解决方案1】:

我确实找到了答案,我没有正确使用生命周期。

fn build_a_offset<'a>(fbb: &'mut FlatBufferBuilder<'fbb>) -> WIPOffset<A<'a>> {
  let args = AArgs {...
  };

  let a = A::create(fbb, &args);

  a
}

fn build_b_buf() -> Vec<u8> {
  let mut fbb = FlatBufferBuilder::new_with_capacity(1024);
  
  let a_offset = build_a_offset(&mut fbb);

  let b_args = BArgs {
    a: a_offset,
    f2: 30u32,
  }

  let b = B::create(&mut fbb, f_args);

  fbb.finish(b); 

  fbb.finished_data().to_vec()

}

我需要将 fbb 引用的签名更改为:

fbb: &'mut FlatBufferBuilder<'fbb>

它是附加后缀生命周期而不是生命周期在引用之前。这是因为前置生命周期控制 reference 的生命周期,而需要控制引用中包含的 data 的生命周期(即附加 @ 987654324@ 在 Rust 中执行)。

最好在教程中添加更多这样的示例。如果您需要,我可以在某个时候提供帮助。

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2021-03-16
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多