7个版本

使用旧Rust 2015

0.2.0 2024年1月2日
0.1.10 2023年3月24日
0.1.9 2022年11月25日
0.1.6 2021年3月12日
0.1.1 2020年5月22日

#263编码

Download history 2283/week @ 2024-04-10 2111/week @ 2024-04-17 1437/week @ 2024-04-24 1303/week @ 2024-05-01 1424/week @ 2024-05-08 1758/week @ 2024-05-15 1695/week @ 2024-05-22 1533/week @ 2024-05-29 1720/week @ 2024-06-05 1399/week @ 2024-06-12 1500/week @ 2024-06-19 1562/week @ 2024-06-26 1466/week @ 2024-07-03 1487/week @ 2024-07-10 1344/week @ 2024-07-17 1004/week @ 2024-07-24

5,543 每月下载量
用于 4 crates

Apache-2.0

50KB
1K SLoC

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

重要说明

这个crate目前正在用于与Firecracker snapshot-restore dev preview的跨版本序列化,但尚未针对其他用例进行测试。在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 deserializing an 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 app version 1.
let mut version_map = VersionMap::new();
// Map structure versions to app version.
version_map
    .new_version() // App version 2.
    .set_type_version(Test::type_id(), 2) // Struct(2) -> App(2).
    .new_version() // App version 3.
    .set_type_version(Test::type_id(), 3); // Struct(3) -> App(3).

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

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

// Deserialize from app 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–1.6MB
~36K SLoC