#serialization #async #framework #safe #100 #alloc-free

nightly no-std diny

一个异步、无分配的序列化框架

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 次下载

MIT/Apache

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