是否有推荐的模式来构建具有嵌套类型的Flatbuffer?

问题描述

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

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

您是否建议以任何方式使用这样的嵌套模式,其中在整个模式中以更高级别的类型使用各种表?

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


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()

}

有关如何正确构建此结构的任何建议将非常有帮助。

解决方法

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

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 的生命周期(即附加在{ {1}}在Rust中使用。

最好在本教程中添加诸如此类的示例。如果您需要的话,我可以在某个时候提供帮助。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...