#serde-json #json #json-format #serde

jsave

以 JSON 格式持久化可序列化的内存数据

4 个版本

0.2.1 2022 年 2 月 27 日
0.2.0 2022 年 2 月 27 日
0.1.1 2022 年 2 月 8 日
0.1.0 2022 年 2 月 7 日

#128 in #json-format

GPL-3.0 或更高版本

39KB
1K SLoC

jsave

以 JSON 格式持久化可序列化的内存数据

Version Documentation License

除非您只有少量数据,否则请勿使用 jsave。它的 I/O 效率不高。请使用如 SQLite 之类的合适数据库。

jsave 提供 RwLockMutexReentrantMutex,它们是 parking_lot 中的那些的封装,并增加了将内存数据序列化和存储到文件的 API。

用法

use serde::{Deserialize, Serialize};
use std::{collections::HashMap, io};

// Data to be persisted. Needs to be serializable and deserializable
#[derive(Debug, Serialize, Deserialize)]
struct Data(HashMap<String, usize>);

impl Default for Data {
    fn default() -> Self {
        Self(HashMap::new())
    }
}

fn main() -> io::Result<()> {
    let path = "PATH_TO_DB_FILE";

    use jsave::Mutex;
    use std::fs::OpenOptions;

    // Open the database file, or create it if it doesn't exist
    let db = if OpenOptions::new()
        .create_new(true)
        .write(true)
        .open(&path)
        .is_ok()
    {
        Mutex::init_with(Data::default(), path)?
    } else {
        Mutex::init(path)?
    };

    {
        // Read and write data just like a regular `Mutex`
        let mut db = db.lock();
        db.0.insert("foo".to_string(), 114514);
        println!("{:?}", *db);
    }

    // Save the data onto the disk. The `Mutex` is locked until the save is complete
    db.save()?;

    Ok(())
}

可选特性

  • pretty - 将数据存储为格式化的 JSON 字符串
  • send_guard - 允许将锁保护器发送到其他线程
  • preserve_order - 在将数据读入值并将数据写回 JSON 字符串时保留输入中映射键的顺序
  • float_roundtrip - 解析固定精度的浮点数时使用足够的精度,以确保它们在通过 JSON 两次往返时保持准确性。这在大约 2 倍于默认最佳努力精度的解析浮点数性能成本上
  • arbitrary_precision - 使用任意精度数字表示法为 serde_json::Number。这允许以任意大小/精度的 JSON 数字读入 Number 并写回 JSON 字符串,而不会丢失精度
  • unbounded_depth - 提供一个 disable_recursion_limit 方法,在不考虑堆栈溢出的情况下解析任意深度的 JSON 结构

许可证

GNU 通用公共许可证 v3.0

依赖关系

~0.7–6.5MB
~30K SLoC