#rkyv #async-io #codec #streaming #serialization #archive #multi-format

无std rkyv_codec

一些适配器,用于通过 AsyncRead 和 AsyncWrite 流式传输 rkyv 归档

4 个版本 (2 个破坏性更新)

0.4.0 2023年4月26日
0.3.1 2023年1月11日
0.3.0 2022年7月11日
0.2.0 2022年2月28日
0.1.0 2022年2月26日

#797 in 编码

每月22次下载

MIT/Apache

40KB
931

rkyv_codec

docs.rs crates.io

rkyv 提供简单的异步编解码器。重用流式缓冲区以实现最大速度!

此crate提供了一种临时的适配器,用于使用可重用外部缓冲区从 AsyncRead 流式传输 Archived<Object>,以及一个 futures::Sink 实现来将 Object 序列化到 AsyncWrite。它默认使用 multiformat 的 unsigned_varint 进行可变长度编码,但允许通过 LengthEncoding 特性进行其他类型的长度编码。它还支持禁用默认功能时直接使用 bytes::BytesMut#[no_std]

示例

此crate有三个示例:chat_client、chat_server & no-std。同时运行前两个示例以查看一个证明概念的 Archive tcp echo 服务器的作用。

要运行

cargorun --examplechat_client

cargorun --examplechat_server

简单使用示例

#[derive(Archive, Deserialize, Serialize, Debug, PartialEq, Clone)]
#[archive_attr(derive(CheckBytes, Debug))] // Checkbytes is required
struct Test {
    int: u8,
    string: String,
    option: Option<Vec<i32>>,
}
let value = Test {
    int: 42,
    string: "hello world".to_string(),
    option: Some(vec![1, 2, 3, 4]),
};
// Writing
let writer = Vec::new();
let mut codec = RkyvWriter::<_, VarintLength>::new(writer);
codec.send(&value).await.unwrap();
// Reading
let mut reader = &codec.inner()[..];
let mut buffer = AlignedVec::new(); // Aligned streaming buffer for re-use
let data: &Archived<Test> = archive_stream::<_, Test, VarintLength>(&mut reader, &mut buffer).await.unwrap(); // This returns a reference into the passed buffer
let value_received: Test = data.deserialize(&mut Infallible).unwrap();
assert_eq!(value, value_received);

请参阅 examples/no-std 以查看支持无std的示例。

基准测试

这是一组基准测试,每个基准测试代表发送或接收50个测试对象。(需要nightly版本)

test tests::bench_archive_sink_50              ... bench:      10,388 ns/iter (+/- 1,603)
test tests::bench_archive_sink_prearchived_50  ... bench:       2,032 ns/iter (+/- 302)
test tests::bench_archive_stream_50            ... bench:       3,544 ns/iter (+/- 438)
test tests::bench_futures_cbor_sink_50         ... bench:      14,105 ns/iter (+/- 1,160)
test tests::bench_futures_cbor_stream_50       ... bench:       9,632 ns/iter (+/- 1,437)
test tests::bench_rkyv_futures_codec_sink_50   ... bench:       6,671 ns/iter (+/- 521)
test tests::bench_rkyv_futures_codec_stream_50 ... bench:       4,925 ns/iter (+/- 948)
test tests::bench_rkyv_writer_50               ... bench:       3,547 ns/iter (+/- 271)
test tests::bench_u64_length_encoding          ... bench:       4,226 ns/iter (+/- 327)
test tests::bench_varint_length_encoding       ... bench:       4,243 ns/iter (+/- 343)

最快的真实基准(完整序列化和字节检查)是使用RkyvWriter进行写入和archive_stream进行读取。这比最慢的基准:futures_codec库的CborCodec要快。

欢迎您贡献自己的基准测试!

依赖项

~4MB
~83K SLoC