rust - 有没有推荐的模式来构建具有嵌套类型的Flatbuffer?

标签 rust flatbuffers

我有一个带有许多嵌套表的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()

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

最佳答案

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

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 ref的签名更改为:
fbb: &'mut FlatBufferBuilder<'fbb>
它是在添加后缀生存期而不是在引用之前的生存期。这是因为预定的生存期控制了引用的生存期,而所需的是控制引用中包含的数据的生存期(即,附加的<'fbb>在Rust中的作用)。
最好为该示例添加更多示例。如果需要的话,我可以在某个时候提供帮助。

关于rust - 有没有推荐的模式来构建具有嵌套类型的Flatbuffer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63771146/

相关文章:

macros - 如何有条件地更改 Rust 宏的一小部分?

rust - 为什么 FlatBufferBuilder 有生命周期?

c++ - 在 C++ 中读取通过 ZMQ 发送的 Flatbuffers 对象会引发未处理的异常

io - 如何使用拦截器将字节从读取器传输到写入器?

rust - 为类型引用实现特征时返回对临时值的引用时出错

c++ - 从 TS 到 C++ 的 FlatBuffers 不起作用

python - 使用 FlatBuffers 编写结构向量

json - Swift:解析 10k 行数据的最高效方法?

for-loop - 对于反向迭代、for 或 while 循环,哪个更快?

rust - 我可以在 Rust 中定义自己的运算符符号吗?