#flat-buffers #deserialize

flatbuffers-retained

这个库允许用户验证flatbuffer一次,并将其移动或存储在数据结构中而无需保持buffer借用。然后可以在不需要重新验证的情况下再次使用。

3个版本 (破坏性更新)

0.3.0 2023年11月3日
0.2.0 2022年12月4日
0.1.0 2022年12月4日

#709 in 数据结构

BSD-2-Clause/MIT

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