7 个版本
0.2.4 | 2021年11月11日 |
---|---|
0.2.3 | 2021年10月19日 |
0.2.0 | 2021年9月27日 |
0.1.0 | 2021年9月19日 |
0.0.2 | 2021年9月9日 |
#1398 在 编码
每月24 次下载
195KB
4K SLoC
diny
一个使用100%安全Rust编写的异步、无分配序列化框架。
diny 目前处于实验阶段,不适合生产使用。此外,它需要使用nightly Rust工具链构建,直到 GAT 稳定。
diny 是一个略微有偏见的异步序列化框架,其工作方式与流行的 Serde 框架非常相似。其主要目的是在内存受限的执行环境中支持异步序列化。因此,它在与Serde相比,做出了一些略微不同的设计权衡。
使用方法
在 Cargo.toml
中添加对 diny
和序列化格式的依赖项。
[dependencies]
diny = { version = "0.2", features = ["derive"] }
diny_test = "0.2"
启用 GAT 支持
#![feature(generic_associated_types)]
为所需的数据类型派生 AsyncSerialization
支持。
use futures::{executor::block_on, SinkExt, StreamExt};
#[derive(diny::AsyncSerialization)]
pub struct Point {
x: i32,
y: i32,
}
let point = Point { x: 1, y: 2 };
// A format can be any implementation of
// diny::backend::{FormatSerialize + FormatDeserialize}.
let format = diny_test::format();
// A writer can be any implementation of futures::io::AsyncWrite.
// This example is using a Vec for simplicity.
let writer = vec!();
// A sink is constructible for any implementor of diny::AsyncSerialize
let mut sink = diny::serializer(format, writer).into_sink();
block_on(sink.send(point)).unwrap();
// Sinks can be destructed back into the inner serializer
let diny::Serializer { format, writer } = sink.try_into_inner().unwrap();
// A reader can be any implementation of futures::io::AsyncBufRead.
// This example is using a utility module to convert the bytes
// written to the vec into an async reader.
let reader = diny::util::AsyncSliceReader::from(&writer[..]);
// A stream is constructible for any implementor of diny::AsyncDeserialize
let mut stream = diny::deserializer(format, reader).into_stream();
let _: Point = block_on(stream.next()).unwrap();
依赖项
~0.6–1MB
~21K SLoC