73个版本

0.8.0-alpha.32024年8月11日
0.8.0-alpha.22024年3月22日
0.8.0-alpha.12024年2月23日
0.7.45 2024年8月20日
0.2.0 2020年11月19日

#52 in 编码

Download history 278681/week @ 2024-05-03 300761/week @ 2024-05-10 295422/week @ 2024-05-17 291940/week @ 2024-05-24 308540/week @ 2024-05-31 292717/week @ 2024-06-07 288440/week @ 2024-06-14 287568/week @ 2024-06-21 279008/week @ 2024-06-28 308574/week @ 2024-07-05 292388/week @ 2024-07-12 294357/week @ 2024-07-19 301480/week @ 2024-07-26 295653/week @ 2024-08-02 307851/week @ 2024-08-09 281678/week @ 2024-08-16

1,239,327 个月下载量
用于 591 个crate (213 直接)

MIT 许可证

740KB
18K SLoC

rkyv

rkyv (archive) 是Rust的零拷贝反序列化框架

Discord crates.io docs.rs MIT license

资源

学习材料

  • rkyv书籍 涵盖了rkyv的动机、架构和主要特性
  • rkyv discord 是一个获取特定问题帮助和认识其他使用rkyv的人的好地方

文档

  • rkyv,核心库
  • rkyv_dyn,它为rkyv添加了对trait object的支持

基准测试

  • rust序列化基准测试 是一种射击风格基准测试,比较了许多Rust序列化解决方案。它包括针对rkyv等零拷贝序列化解决方案的特殊基准测试。

姐妹crate

示例

use rkyv::{Archive, Deserialize, Serialize, rancor::Error};

#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)]
#[rkyv(
    // This will generate a PartialEq impl between our unarchived and archived
    // types:
    compare(PartialEq),
    // bytecheck can be used to validate your data if you want. To use the safe
    // API, you have to derive CheckBytes for the archived type:
    check_bytes,
    // Derives can be passed through to the generated type:
    derive(Debug),
)]
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]),
};

// Serializing is as easy as a single function call
let bytes = rkyv::to_bytes::<Error>(&value).unwrap();

// Or you can customize your serialization for better performance
// and compatibility with #![no_std] environments
use rkyv::ser::{Serializer, serializers::AllocSerializer};

let mut serializer = AllocSerializer::<0>::default();
serializer.serialize_value(&value).unwrap();
let bytes = serializer.into_serializer().into_inner();

// You can use the safe API for fast zero-copy deserialization
let archived = rkyv::check_archived_root::<Test>(&bytes[..]).unwrap();
assert_eq!(archived, &value);

// Or you can use the unsafe API for maximum performance
let archived = unsafe { rkyv::archived_root::<Test>(&bytes[..]) };
assert_eq!(archived, &value);

// And you can always deserialize back to the original type
let deserialized: Test = archived.deserialize(&mut rkyv::Infallible).unwrap();
assert_eq!(deserialized, value);

注意:安全的API需要启用bytecheck功能(默认启用) 更多信息请参阅可用功能.

感谢

感谢所有使开发可持续的赞助商。特别感谢以下赞助商,他们为支持rkyv做出了超越的贡献

白金赞助商

Dusk Network

Dusk Network是第一个用于金融应用的隐私区块链。我们的使命是使任何规模的企业都能进行大规模合作,满足合规要求,并确保交易数据保持机密。

依赖关系

~0.6–1.5MB
~33K SLoC