Serde
Serde: 是 rust 语言用来序列化和反序列化数据的解决方案
- 体现了定义与实现分离的设计思想
- serde 基于 rust 的 trait 来实现自己的序列化
- 具有较好的性能
Serialization Deserialization
- 一个是将内存中的数据结构或对象转换成二进制序列的过程使其可以用于网络传输或是保存到本地
- 一个是将在序列化过程中所生成的二进制序列转换成数据结构或者对象的过程,实际上就是一个相反的过程
Serializer:serde_json、serde_yaml
- Serialize 定义 && Serializer 实现
- Serde 提供一个宏 serde_derive 自动的为结构体类型和枚举类型生成 Serialize 和 Deserialize 实现
- #[derive(Serialize)]
- 但是 Serde 没有实现 Serializer Deserializer
- 一般情况下我们用第三方库来实现 Serializer、Deserializer
rust
serde = {version = "1", features = ["derive"]}
rust
// 宏 日常这样写
use serde::Serialize;
#[derive(Serialize)]
struct Person {
name: String,
age: u8,
phones: Vec<String>,
}
// 手动实现(演示上面干了什么)
// 这种方法和上面等效
use serde::ser::{Serialize, SerializeStruct};
struct Person {
name: String,
age: u8,
phones: Vec<String>,
}
impl Serialize for Person {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let mut s = serializer.serialize_struct("person", 3)?;
s.serialize_field("name", &self.name)?;
s.serialize_field("age", &self.age)?;
s.serialize_field("phones", &self.phones)?;
s.end()
}
}
Serde、Json、Yaml实战
- Json和Yaml用的比较多
- Xml好多年没更新了
rust
serde_json = "1"
serde_yaml = "0.8"
rust
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize, Debug)]
struct Pay {
amount: i32,
tax_percent: f32,
}
#[derive(Serialize, Deserialize, Debug)]
struct Person {
name: String,
age: u8,
phone: String,
pays: Vec<Pay>,
}
fn main() {
let ps = vec![Person{
name: "zz".to_string(),
age: 45,
phone: "2324".to_string(),
pays: vec![
Pay {
amount: 100,
tax_percent: 0.1,
},
Pay {
amount: 200,
tax_percent: 0.2,
}
]
}];
let json_str = serde_json::to_string_pretty(&ps).unwrap();
let yaml_str = serde_yaml::to_string(&ps).unwrap();
println!("json: {}", json_str);
println!("yaml: {}", yaml_str);
let ps_json: Vec<Person> = serde_json::from_str(json_str.as_str()).unwrap();
let ps_yaml: Vec<Person> = serde_yaml::from_str(yaml_str.as_str()).unwrap();
println!("{:?}", ps_json);
println!("{:?}", ps_yaml);
}
修改Json实战
json
{
"name": "zz",
"age": 45,
"phone": [
"12223",
"232431"
]
}
rust
fn main() {
let json_data = std::fs::read_to_string("./data.json").unwrap();
let mut data: serde_json::Value = serde_json::from_str(json_data.as_str()).unwrap();
println!("before: {}", data);
// 加字段
data["car"] = serde_json::Value::String("fdd".to_string());
// 加json
let mut map_value = serde_json::Map::new();
map_value.insert(
"color".to_string(),
serde_json::Value::String("red".to_string())
);
map_value.insert(
"year".to_string(),
serde_json::Value::Array(vec![
serde_json::Value::String("1900".to_string()),
serde_json::Value::String("2000".to_string()),
]),
);
data["car"] = serde_json::Value::Object(map_value);
println!("after: {}", data);
}
结果:
json
after: {"age":45,"car":{"color":"red","year":["1900","2000"]},"name":"zz","phone":["12223","232431"]}