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

byteserde_types

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

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日

#1995编码

Download history 5/week @ 2024-05-12 25/week @ 2024-05-19 28/week @ 2024-05-26 28/week @ 2024-06-02 19/week @ 2024-06-09 32/week @ 2024-06-16 28/week @ 2024-06-23 6/week @ 2024-06-30 19/week @ 2024-07-07 38/week @ 2024-07-14 24/week @ 2024-07-21 47/week @ 2024-07-28

每月128次下载
11 个crate中(直接使用5个) 使用

自定义许可证

130KB
2K SLoC

master

动机

  • 该产品的动机有两个方面

    • 能够通过简单地使用derive 注解和属性,将通常从网络获得的byte slice &[u8]映射到Rust struct数据模型。

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

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

      • byteserde - ~15ns 读写
      • bincode - ~15ns 读 / ~100ns
      • rmp-serde - ~215ns 读写
      • serde_json - ~600ns 读写 - 由于使用字符串,速度较慢,可以理解

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

使用

  • 如果您使用的是以字节流格式传输数据的网络协议,并且这种格式不符合广泛使用标准,例如:bincodeprotobuf。使用这款产品可以高效地将您的字节流映射到Rust的struct

  • 您有一个对延迟敏感的使用场景。请注意,此协议在序列化过程中不添加任何模式信息,因此相当于不填充地丢弃结构的内存布局。

  • 以下是一些非常适合此框架的协议示例。

避免

  • 如果使用广泛使用的标准将字节流序列化或反序列化,请避免使用此框架,而是使用该标准与字节流一起工作。

该项目包含三个特质

[email protected] - byteserde_derive/Cargo.toml

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

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

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

    • #[derive(ByteSerializedSizeOf)] - 生成ByteSerializedSizeOf特质 - 此特质提供了一个关联方法byte_size,它给出一个在字节中无对齐的结构的内存大小。然而,它不支持堆分配的类型,例如:向量、字符串或其派生类型。

    • #[derive(ByteSerializedLenOf)] - 生成 ByteSerializedLenOf trait - 该特质提供了一个 instance 方法 byte_len(&self),该方法返回特定实例的内存大小(不包含对齐)。它专门用于处理 ByteSerializedSizeOf trait 不支持的数据类型。

  • 更多示例请参考 这里
  • 注意:Union 和 Unit 结构不受支持,但未来可能会改变。

[email protected] - byteserde/Cargo.toml

  • 亮点
    • ByteSerializerStack<CAP> - 提供了一种超快的序列化方法,将数据序列化到一个预先分配的 byte array [u8; CAP] 上,因此得名,它非常快,但代价是需要指定要序列化的最大的 struct 的大小。如果达到预分配字节数组的边界,序列化将失败。此实用程序提供了一个重置功能,将内部计数器移至开始位置,允许您多次回收缓冲区。

    • ByteSerializerHeap - 提供了一种足够快的序列化方法,将数据序列化到一个 byte vector Vec<u8> 上,因此得名。此实用程序通过不必预先知道最大的 struct 大小来换取一些性能。

    • ByteDeserializerSlice - 接收一个 byte stream &[u8](无论堆分配还是栈分配),并将其转换为 struct

[email protected] - byteserde_types/Cargo.toml

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

示例 & 概述

  • 请参阅此文档以获取多个综合示例和功能概述。

依赖项

~0.5–1.1MB
~24K SLoC