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 |
|
#1160 in 过程宏
3,245每月下载量
用于 5 crates
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