63个版本

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日

#13#rkyv

Download history 268329/week @ 2024-04-29 288098/week @ 2024-05-06 301586/week @ 2024-05-13 295132/week @ 2024-05-20 295312/week @ 2024-05-27 301669/week @ 2024-06-03 299341/week @ 2024-06-10 286738/week @ 2024-06-17 279228/week @ 2024-06-24 280031/week @ 2024-07-01 319696/week @ 2024-07-08 282942/week @ 2024-07-15 295707/week @ 2024-07-22 301670/week @ 2024-07-29 300861/week @ 2024-08-05 287548/week @ 2024-08-12

1,199,681 每月下载量
593 个crate(3个直接使用) 中使用

MIT 许可证

115KB
3K 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是第一个用于金融应用的隐私区块链。我们的使命是使任何规模的企业都能大规模合作,满足合规要求,并确保交易数据保持机密。

依赖

~260–700KB
~17K SLoC