4个版本

使用旧的Rust 2015

0.1.6 2023年8月24日
0.1.5 2023年3月24日
0.1.4 2021年1月13日
0.1.3 2020年9月17日
0.1.1 2020年5月20日

#1160 in 过程宏

Download history 1182/week @ 2024-03-25 1181/week @ 2024-04-01 918/week @ 2024-04-08 867/week @ 2024-04-15 941/week @ 2024-04-22 778/week @ 2024-04-29 828/week @ 2024-05-06 847/week @ 2024-05-13 919/week @ 2024-05-20 821/week @ 2024-05-27 983/week @ 2024-06-03 919/week @ 2024-06-10 935/week @ 2024-06-17 828/week @ 2024-06-24 663/week @ 2024-07-01 737/week @ 2024-07-08

3,245每月下载量
用于 5 crates

Apache-2.0

37KB
574 代码行

Versionize 是一个用于 Rust 数据结构版本容忍序列化/反序列化的框架,旨在用于需要快速反序列化时间和最小大小开销的场景。它不旨在成为通用的序列化框架,并且仅支持 bincode 后端。

你可能还在找

重要说明

这个crate目前用于与 Firecracker 快照还原开发预览 进行跨版本序列化,但尚未针对其他用例进行测试。应将其视为 Firecracker 上下文之外的 实验性软件。这个crate未来可能会看到接口和实现方面的更改。

Versionize 的实际应用

    extern crate versionize;
    extern crate versionize_derive;

    use versionize::{VersionMap, Versionize, VersionizeResult};
    use versionize_derive::Versionize;

    // The test structure is at version 3.
    #[derive(Debug, PartialEq, Versionize)]
    pub struct Test {
        a: u32,
        #[version(start = 2, end = 3)]
        b: u8,
        #[version(start = 3, default_fn = "default_c")]
        c: String,
    }

    impl Test {
        // Default value for field `c`.
        // The callback is invoked when deserialization from and older version
        // where the field did not exist.
        fn default_c(_source_version: u16) -> String {
            "test_string".to_owned()
        }
    }

    // Memory to hold the serialization output.
    let mut mem = vec![0u8; 512];
    // Create a new version map - it will start at version 1.
    let mut version_map = VersionMap::new();
    // Add new version and mark changes for Test struct: Set the current version
    // to point to Test struct version 2.
    version_map
        .new_version()
        .set_type_version(Test::type_id(), 2)
        .new_version()
        .set_type_version(Test::type_id(), 3);

    let test_struct = Test {
        a: 1337,
        b: 0xFF,
        c: "c_value".to_owned(),
    };

    // Serialize to version 2 - field c will not be serialized.
    test_struct
        .serialize(&mut mem.as_mut_slice(), &version_map, 2)
        .unwrap();

    // Deserialize from version 2 - c should contain the default_fn() return value.
    let restored_test_struct = Test::deserialize(&mut mem.as_slice(), &version_map, 2).unwrap();

    assert_eq!(
        restored_test_struct,
        Test {
            a: 1337,
            b: 255,
            c: "test_string".to_owned()
        }
    );

依赖关系

~1.5MB
~35K SLoC