用Rust玩转数据存储:JSON文件持久化实战你是否想过如何让Rust程序中的数据“长久保存”?在开发中,数据从内存到文件的持久化是一个常见需求。Rust凭借其高性能和安全性,结合强大的Serde框架,能轻松实现数据的JSON文件存储与读取。本文将带你通过一个简单却实用的Us
你是否想过如何让 Rust 程序中的数据“长久保存”?在开发中,数据从内存到文件的持久化是一个常见需求。Rust 凭借其高性能和安全性,结合强大的 Serde 框架,能轻松实现数据的 JSON 文件存储与读取。本文将带你通过一个简单却实用的 User 数据结构示例,从零开始实现数据的持久化,代码清晰、步骤详尽,适合 Rust 新手快速上手,也为进阶开发者提供灵感。快来一起“玩转” Rust 的数据存储吧!
本文通过一个 Rust 项目,展示了如何使用 Serde 框架实现 User 数据结构的 JSON 文件持久化。内容涵盖项目搭建、依赖配置、核心代码实现和测试验证,详细讲解了数据从内存到文件的序列化与反序列化过程。通过标准库的 std::fs::File 进行文件操作,结合 Serde 的强大功能,代码简洁高效。无论你是 Rust 初学者还是想深入学习数据持久化的开发者,这篇实战教程都能让你快速掌握从内存到文件的存储技巧。
~/Code/rust via 🅒 base
➜ cargo new training_code --lib
Created library `training_code` package
~/Code/rust via 🅒 base
➜ cd training_code
training_code on master [?] via 🦀 1.71.0 via 🅒 base
➜ c
training_code on master [?] is 📦 0.1.0 via 🦀 1.71.0 via 🅒 base
➜ tree -a -I "target|.git"
.
├── .gitignore
├── Cargo.lock
├── Cargo.toml
└── src
├── lib.rs
└── user.rs
2 directories, 5 files
training_code on master [?] is 📦 0.1.0 via 🦀 1.71.0 via 🅒 base
➜
[package]
name = "training_code"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
serde = { version = "1.0.178", features = ["derive"] }
serde_json = "1.0.104"
pub mod user;
// 用文件持久化数据结构
// 思考:如何在内存和IO设备间交换数据?
use std::{
fs::File,
io::{Read, Write},
};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub enum Gender {
Unspecified = 0,
Male = 1,
Female = 2,
}
#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct User {
pub name: String,
age: u8,
pub(crate) gender: Gender,
}
impl User {
pub fn new(name: String, age: u8, gender: Gender) -> Self {
Self { name, age, gender }
}
pub fn load(filename: &str) -> Result<Self, std::io::Error> {
let mut file = File::open(filename)?;
let mut data = String::new();
file.read_to_string(&mut data)?;
let user = serde_json::from_str(&data)?;
Ok(user)
}
pub fn persist(&self, filename: &str) -> Result<usize, std::io::Error> {
let mut file = File::create(filename)?;
// // ? eq
// match File::create(filename) {
// Ok(f) => {
// todo!()
// }
// Err(e) => return Err(e),
// }
let data = serde_json::to_string(self)?;
file.write_all(data.as_bytes())?;
Ok(data.len())
}
}
impl Default for User {
fn default() -> Self {
User::new("Unknown User".into(), 0, Gender::Unspecified)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let user = User::default();
let path = "/tmp/user1";
user.persist(path).unwrap();
let user1 = User::load(path).unwrap();
assert_eq!(user, user1);
}
}
use std::{
fs::File,
io::{Read, Write},
};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub enum Gender {
Unspecified = 0,
Male = 1,
Female = 2,
}
#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct User {
pub name: String,
age: u8,
pub(crate) gender: Gender,
}
impl User {
pub fn new(name: String, age: u8, gender: Gender) -> Self {
Self { name, age, gender }
}
pub fn load(filename: &str) -> Result<Self, std::io::Error> {
let mut file = File::open(filename)?;
let mut data = String::new();
file.read_to_string(&mut data)?;
let user = serde_json::from_str(&data)?;
Ok(user)
}
pub fn persist(&self, filename: &str) -> Result<usize, std::io::Error> {
let mut file = File::create(filename)?;
// // ? eq
// match File::create(filename) {
// Ok(f) => {
// todo!()
// }
// Err(e) => return Err(e),
// }
let data = serde_json::to_string(self)?;
file.write_all(data.as_bytes())?;
Ok(data.len())
}
impl Default for User {
fn default() -> Self {
User::new("Unknown User".into(), 0, Gender::Unspecified)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let user = User::default();
let path = "/tmp/user1";
user.persist(path).unwrap();
let user1 = User::load(path).unwrap();
assert_eq!(user, user1);
}
}
这段代码通过 Rust 和 Serde 实现了一个简单但完整的 JSON 文件持久化功能,展示了内存与 IO 设备间数据交换的核心流程。User 结构体的定义、persist 和 load 方法的实现,以及测试用例,共同构成了一个易于学习和扩展的示例。代码体现了 Rust 的安全性、高效性和 Serde 的灵活性,适合初学者学习数据持久化,也为进阶开发者提供了可复用的模板。
training_code on master [?] is 📦 0.1.0 via 🦀 1.71.0 via 🅒 base
➜ cargo test
Compiling training_code v0.1.0 (/Users/qiaopengjun/Code/rust/training_code)
Finished test [unoptimized + debuginfo] target(s) in 0.70s
Running unittests src/lib.rs (target/debug/deps/training_code-c41752abc7a3994f)
running 1 test
test user::tests::it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests training_code
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
training_code on master [?] is 📦 0.1.0 via 🦀 1.71.0 via 🅒 base
➜
通过这篇实战教程,我们用 Rust 和 Serde 完成了一个数据持久化的完整案例。从定义 User 数据结构到实现 JSON 序列化与文件读写,再到通过测试验证功能的正确性,整个过程清晰且实用。这个示例不仅展示了 Rust 在数据处理中的高效与安全,还为开发者提供了一个可复用的模板。无论是构建小型工具还是复杂应用,掌握数据持久化都是关键一步。希望这篇文章能激发你用 Rust 探索更多可能!
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!