2 个不稳定版本
0.2.0 | 2024 年 5 月 14 日 |
---|---|
0.1.0 | 2024 年 5 月 11 日 |
#104 in 无标准库
每月 56 次下载
用于 2 crate
19KB
284 行
ser-write
为方便嵌入式(no_std
)目标设计的 writer 风格序列化和反序列化工具。
- Writer 风格序列化器使用本库中发现的通用 writer 特性。
- 为
no_std
设计。 - 当启用时,完全支持
std
或alloc
,以提高代码的可移植性和可测试性。 - 为每个序列化器提供了一个方便的反序列化器。
- 嵌入式项目可以为自定义容器、帧构建器等实现
SerWrite
特性。
本库提供
- 特性 -
SerWrite
,序列化器应使用该特性来写入序列化输出, SerError
- 一个方便的错误类型,SliceWriter
- 一个方便的切片写入对象,实现了SerWrite
,- 为外部类型提供了
SerWrite
实现。
根据启用的 crate 功能,SerWrite
实现了以下内容:
SliceWriter
- 示例切片写入实现,arrayvec::ArrayVec<u8,CAP>
-arrayvec
功能,heapless::Vec<u8,CAP>
-heapless
功能,Vec<u8>
-alloc
或std
功能,VecDeque<u8>
-alloc
或std
功能,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>
。
序列化器
目前可用的序列化和反序列化器有
- JSON (紧凑) - ser-write-json
- MessagePack - ser-write-msgpack
示例
一个 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
- serde-json-core-fmt (利用
fmt::Display
特性的尝试式写入器)
serde-json-core
是一个真正的 no_std
,没有 alloc
的替代方案,但使用起来不太方便。必须将数据序列化到中间切片中,而不是直接将数据推送到输出缓冲区或帧构建器实现。
为什么这样呢?
- 一旦像
io::Write
这样的功能进入 Rust 核心库,这个包就不再需要了。
Rust 版本要求
ser-write
需要 Rustc 版本 1.75 或更高。
依赖项
~125KB