#deserializer #serialization #serde #traits #write #embedded #targets

无 std ser-write

为无_std 目标设计的 writer 风格序列化和反序列化通用特性

2 个不稳定版本

0.2.0 2024 年 5 月 14 日
0.1.0 2024 年 5 月 11 日

#104 in 无标准库

Download history 362/week @ 2024-05-10 33/week @ 2024-05-17 15/week @ 2024-05-24 8/week @ 2024-05-31 5/week @ 2024-06-07 5/week @ 2024-06-14 1/week @ 2024-07-05 22/week @ 2024-07-12 41/week @ 2024-07-19 10/week @ 2024-07-26 2/week @ 2024-08-02

每月 56 次下载
用于 2 crate

MIT/Apache

19KB
284

ser-write

Crate Docs Build Status Coverage Status Minimum rustc version

为方便嵌入式(no_std)目标设计的 writer 风格序列化和反序列化工具。

  • Writer 风格序列化器使用本库中发现的通用 writer 特性。
  • no_std 设计。
  • 当启用时,完全支持 stdalloc,以提高代码的可移植性和可测试性。
  • 为每个序列化器提供了一个方便的反序列化器。
  • 嵌入式项目可以为自定义容器、帧构建器等实现 SerWrite 特性。

本库提供

  • 特性 - SerWrite,序列化器应使用该特性来写入序列化输出,
  • SerError - 一个方便的错误类型,
  • SliceWriter - 一个方便的切片写入对象,实现了 SerWrite
  • 为外部类型提供了 SerWrite 实现。

根据启用的 crate 功能,SerWrite 实现了以下内容:

  • SliceWriter - 示例切片写入实现,
  • arrayvec::ArrayVec<u8,CAP> - arrayvec 功能,
  • heapless::Vec<u8,CAP> - heapless 功能,
  • Vec<u8> - allocstd 功能,
  • VecDeque<u8> - allocstd 功能,
  • io::Cursor<T: io::Write> - std 功能,

使用方法

首先向序列化器添加依赖项

例如

[dependencies]
ser-write-json = { version = "0.1", default-features = false }

如果您还想要获取外型类型的 SerWrite 实现,请添加

ser-write = { version = "0.1", default-features = false, features = ["arrayvec", "heapless"] }

在上面的示例中,选择了以下类型的实现:arrayvec::ArrayVec<u8;_>heapless::Vec<u8>

序列化器

目前可用的序列化和反序列化器有

示例

一个 SliceWriter 实现示例

use ser_write::{SerWrite, SerResult, SerError};

#[derive(Debug, PartialEq)]
pub struct SliceWriter<'a> {
    pub buf: &'a mut [u8],
    pub len: usize
}

impl SerWrite for SliceWriter<'_> {
    fn write(&mut self, buf: &[u8]) -> SerResult<()> {
        let end = self.len + buf.len();
        match self.buf.get_mut(self.len..end) {
            Some(chunk) => {
                chunk.copy_from_slice(buf);
                self.len = end;
                Ok(())
            }
            None => Err(SerError::BufferFull)
        }
    }
}

替代方案

仅针对 alloc

或者,有一个 Rust嵌入式社区包用于在不使用 std 的情况下序列化 JSON

serde-json-core 是一个真正的 no_std,没有 alloc 的替代方案,但使用起来不太方便。必须将数据序列化到中间切片中,而不是直接将数据推送到输出缓冲区或帧构建器实现。

为什么这样呢?

  • 一旦像 io::Write 这样的功能进入 Rust 核心库,这个包就不再需要了。

Rust 版本要求

ser-write 需要 Rustc 版本 1.75 或更高。

依赖项

~125KB