#flat-buffers #serialization #owned

flatbuffers-owned

一个使 FlatBuffers 使用更加灵活的 Rust crate。

3 个不稳定版本

0.2.0 2023年7月25日
0.1.1 2023年3月15日
0.1.0 2023年3月15日

#1225数据结构

MIT 协议

14KB
57

flatbuffers-owned − 构建状态 许可证 最新版本 docs-badge

一个使 FlatBuffers 使用更加灵活的 Rust crate。

使用 flatbuffers_owned! 宏,你可以为你的 flatc 生成的 Rust FlatBuffers 生成包装结构体。
生成的包装结构体利用更灵活的生命周期来访问实际的底层 FlatBuffer 结构。
由于生命周期更加宽松,原始的 FlatBuffer 字节可以被拥有并移动,或者用任何可用生命周期进行引用。

使用方法

将以下内容添加到你的 Cargo.toml

[dependencies]
flatbuffers-owned = "0.2"

快速入门

在你的 FlatBuffers 上使用 flatbuffers_owned! 宏来生成包装结构体。

这将为 RelaxedMessage 包装结构体和 Message FlatBuffer 的 OwnedMessage 类型别名生成。

use flatbuffers_owned::*;

flatbuffers_owned!(Message);

接收一个字节数组,创建一个装箱切片,并初始化拥有的 flatbuffer

fn main() {
    let message_bytes: &[u8] = receive_message_bytes();
    let message_bytes: Box<[u8]> = Box::from(message_bytes);

    let owned_message = OwnedMessage::new(message_bytes).unwrap();
}

访问实际的 FlatBuffer

fn main() {
    let message: Message = owned_message.as_actual();

    assert_eq!(message.get_text().unwrap(), "Hello, world!");
}

错误处理

new() 构造函数始终使用 FlatBuffer 内置的 run_verifier() 方法验证原始 FlatBuffer 字节。
由于可能会传递有问题的字节数组,您需要检查构造函数返回的 Result。

fn main() {
    for id in message_ids {
        let message_bytes = Box::from(receive_message_bytes());

        let owned_message = OwnedMessage::new(message_bytes);

        match owned_message {
            Ok(message) => {
                // ... process message
            },
            Err(e) => {
                println!("Failed to parse Message: {}", e);
                // ... handling logic
            }
        }
    }
}

方法

包装结构体

Relaxed{FLATBUFFER_NAME}包装结构体是一个Newtype,它可以包裹任何可以转换为字节切片引用的结构体。(where TBuffer: AsRef<[u8]>
这个结构体可以与完全拥有其内存或仅持有共享引用的缓冲区一起使用。

在包装结构体生成的Owned{FLATBUFFER_NAME}类型别名中,预先定义了TBuffer泛型。
对于我们的Message示例FlatBuffer,生成的类型别名代码如下

pub type OwnedMessage = RelaxedMessage<Box<[u8]>>;

转换为&[u8]

RelaxedFlatBufferTrait强制将底层[u8]字节切片进行解引用。
由于Deref特质的关联类型不能携带生命周期,因此无法将实际FlatBuffer结构体进行解引用,这是很遗憾的。

欢迎提出反馈

如果您有任何改进的想法或希望为这个项目做出贡献,请随时提出问题或发送pull request。

对于这是我第一个(公开发布的)库,我也很乐意接受任何一般性的提示或建议。 :)

许可证

本项目根据MIT许可证发布,允许用于商业用途、修改、分发和私人用途。
请参阅LICENSE文件以获取许可证的完整文本。

依赖关系

~225KB