3个版本 (破坏性更新)
0.3.0 | 2023年11月3日 |
---|---|
0.2.0 | 2022年12月4日 |
0.1.0 | 2022年12月4日 |
#709 in 数据结构
16KB
255 行
概述
目前,flatbuffers库无法在验证flatbuffer缓冲区一次后,将其移动并放入长期结构中使用,然后再使用flatbuffer结构。
不安全的函数root_unchecked使我们能够实现这一点,但由于检查可能在程序执行的不同时间发生,因此很难对这种不安全函数进行推理,并且可能很难推理出哪些是或不是经过验证的flatbuffer缓冲区。
方法
这个库公开了3个结构
- FlatbufferRetained ** 它接受一个未前缀的flatbuffer并在新函数中验证它,允许用户快速获取反序列化的flatbuffer。
- SizePrefixedFlatbufferRetained ** 它接受一个带大小前缀的flatbuffer并在新函数中验证它,允许用户快速获取反序列化的flatbuffer。
- Retained ** 它允许用户加载未前缀或带大小前缀的flatbuffer并快速反序列化它。
示例
一个基本示例,修改自教程 https://google.github.io/flatbuffers/flatbuffers_guide_tutorial.html,位于examples/basic.rs中
可以通过调用 cargo run --example basic
来运行
如何使用此库在加速结构中存储数据的示例,可以在tests/test.rs中的测试test_stored_in_map
中看到。
#[derive(Default)]
struct MonstersHolder<'a> {
monsters: std::collections::HashMap<i16, SerializedMonster<'a>>,
}
fn main () -> Result<(), flatbuffers::InvalidFlatbuffer> {
let mut monsters = MonstersHolder::default();
monsters.monsters.insert(1, SerializedMonster::new(buf)?);
monsters.monster.get(1).unwrap().get().hp();
// Note here we are borrowing the monsters Map mutably
// but we do not run afoul of the borrow checker since
// Monster 1's Vec is no longer borrowed but has been
// safely validated before.
monsters.monsters.insert(2, SerializedMonster::new(buf)?);
monsters.monster.get(1).unwrap().get().hp();
monsters.monster.get(2).unwrap().get().hp();
}
依赖项
~220KB