#byte-stream #byte #serialization #derive #serde #macro-derive

byteserde_derive

一个用于将字节流映射到/从任意结构体类型(着重于性能)的进程宏

8个版本 (5个重大更改)

0.6.2 2024年1月14日
0.6.1 2024年1月11日
0.6.0 2023年12月24日
0.5.0 2023年11月13日
0.1.1 2023年5月19日

#45 in #bytes

Download history 8/week @ 2024-03-11 7/week @ 2024-03-25 22/week @ 2024-04-01 10/week @ 2024-05-13 27/week @ 2024-05-20 29/week @ 2024-05-27 32/week @ 2024-06-03 29/week @ 2024-06-10 23/week @ 2024-06-17 38/week @ 2024-06-24

每月下载量 122
用于 12 个crate(直接使用 6 个)

自定义许可

60KB
1K SLoC

master

动机

  • 该产品的动机有两方面

    • 能够通过简单的使用derive宏注解和属性,将通常从网络获取的byte slice &[u8]映射到Rust struct数据模型中,并自动生成必要的代码。

    • byte slice未使用现有的广泛可用协议进行序列化时,这非常方便。例如,一个特定应用的C-Struct

    • 成为市场上最快的字节流序列化/反序列化工具,适用于对延迟敏感的场景。以下基准测试结果展示了使用不同框架序列化/反序列化参考结构体的性能摘要

      • byteserde - ~15ns 读写
      • bincode - ~15ns 读写
      • rmp-serde - ~215ns 读写
      • serde_json - ~600ns 读写 - 由于使用了字符串,速度较慢,可以理解
        • 此文档 包含基准测试的详细信息。

何时使用此框架以及何时避免使用

使用

  • 如果你正在处理以byte stream格式提供数据的网络协议,而这些协议并不符合广泛可用标准,例如bincodeprotobuf》。使用此产品高效地将你的byte stream映射到Rust struct

  • 您有一个对延迟敏感的使用场景。请注意,该协议在序列化过程中不添加任何架构信息,因此与直接转储结构体内存布局而不添加填充等效。

  • 以下是一些与该框架完美匹配的协议示例。

避免

  • 如果使用广泛可用的标准对字节流进行序列化或反序列化,请避免使用此框架,而是使用相应的标准来处理字节流

该项目包含三个craits

[email protected] - byteserde_derive/Cargo.toml

  • 包含生成[email protected]特质的derive宏
    • #[derive(ByteSerializeStack)] - 生成ByteSerializeStack特质

    • #[derive(ByteSerializeHeap)] - 生成ByteSerializeHeap特质

    • #[derive(ByteDeserializeSlice)] - 生成ByteDeserializeSlice特质

    • #[derive(ByteSerializedSizeOf)] - 生成ByteSerializedSizeOf特质 - 该特质提供了一个关联方法byte_size(),它返回一个字节大小的结构体内存大小(无对齐)。然而,它不支持堆分配的类型,例如Vector、String或它们的派生类型。

    • #[derive(ByteSerializedLenOf)] - 生成ByteSerializedLenOf特质 - 该特质提供了一个实例方法byte_len(&self),它返回特定实例的字节大小(无对齐)。它专门用于处理ByteSerializedSizeOf特质不支持的情况。

  • 更多示例请参阅此处
  • 注意:Union和Unit结构不支持,但将来可能会改变。

[email protected] - byteserde/Cargo.toml

  • 亮点
    • ByteSerializerStack<CAP> - 提供超快的序列化器,将数据序列到预分配的栈上byte array [u8; CAP],因此得名。这个实用程序在达到预分配字节数组的边界时,序列化将失败。它提供重置功能,将内部计数器移至开始处,允许您多次回收缓冲区。

    • ByteSerializerHeap - 提供足够快的序列化器,通过将数据序列到byte vector Vec<u8>,因此得名。这个实用程序以一些性能为代价,避免了在预先不知道最大的struct大小时需要担心。

    • ByteDeserializerSlice - 接受byte stream &[u8],无论堆还是栈分配,将其转换为struct

[email protected] - byteserde_types/Cargo.toml

  • 包含可选的ASCII字符串相关类型和宏,通常在解析字节流时处理固定长度字符串时很有用,有关更多详细信息,请参阅示例部分

示例 & 概述

  • 请参阅此文档,其中包含大量综合示例和功能概述。

依赖项

~285–740KB
~18K SLoC