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
39KB
1K SLoC
jsave
以 JSON 格式持久化可序列化的内存数据
除非您只有少量数据,否则请勿使用 jsave。它的 I/O 效率不高。请使用如 SQLite 之类的合适数据库。
jsave 提供 RwLock
、Mutex
和 ReentrantMutex
,它们是 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