#serialization #database #content-addressable #break #store #values #stored

casserole

分解并序列化值到内容可寻址存储

2个不稳定版本

0.2.0 2021年8月4日
0.1.0 2021年7月20日

#1178编码

Download history 150/week @ 2024-03-15 73/week @ 2024-03-22 92/week @ 2024-03-29 82/week @ 2024-04-05 51/week @ 2024-04-12 110/week @ 2024-04-19 136/week @ 2024-04-26 102/week @ 2024-05-03 76/week @ 2024-05-10 176/week @ 2024-05-17 76/week @ 2024-05-24 99/week @ 2024-05-31 61/week @ 2024-06-07 40/week @ 2024-06-14 84/week @ 2024-06-21 18/week @ 2024-06-28

每月222次下载

MIT/Apache

19KB
351

casserole 包提供了一种自定义 derive 和一个 trait,用于对 Rust 类型执行分解序列化和反序列化到存储。

最常见用例是将大对象分解存储到内容可寻址存储中,例如 Git 数据库。因此得名 'CAS-ser-role'。

Casserole 自动 derive 的 trait 生成更小的类型,其中包含键的引用而不是原始数据。例如,HashMap<String, BigValue> 被替换为 HashMap<String, S::Key>,其中 S 是用户提供的存储引擎的类型参数。此外,具有 store 属性的字段(例如 #[casserole(store)],也被替换为 S::Key

例如

/// Example Tree to be stored in the database
#[derive(Casserole)]
struct Node {
    header: String,

    // Tells that 'map' is replaced by a database key in the type returned from
    // the 'casserole' trait method. The 'decasserole' trait method will do the
    // reverse, restoring it from the database.
    #[casserole(store)]
    map: BTreeMap<String, Node>,
}

基本使用演示(假设 big_value 是一个要处理的大值)

// Create a our serde-ready type for the root. `stored_root` is our unique
// representation for `big_value`, but it is very small, like a Git hash.
let stored_root = big_value.casserole(&mut store).unwrap();

// <...do other stuff...>

// Restore the origin value from the database
let restored_big_value = Casserole::decasserole(&stored, &mut store).unwrap();
assert_eq!(restored_big_value, big_value);

依赖关系

~1.3–3MB
~56K SLoC