由于 serde 库默认使用 JSON 格式进行序列化和反序列化
因此程序将使用 JSON 格式对数据进行序列化和反序列化
社区为 Serde 实现的部分数据格式列表:
- JSON:广泛使用的 JavaScript 对象符号,用于许多 HTTP API
- Postcard:no_std 和嵌入式系统友好的紧凑二进制格式。
- CBOR:用于小消息大小且无需版本协商的简洁二进制对象表示法。
- YAML:自称为“人类友好”的配置语言(不是标记语言)。
- MessagePack:类似于紧凑 JSON 的高效二进制格式。
- TOML:Cargo 使用的最小配置格式。
- Pickle:Python 世界中常见的格式。
- RON:一种 Rust 对象表示法。
- BSON:MongoDB 使用的数据存储和网络传输格式。
- Avro:用于 Apache Hadoop 内部的二进制格式,支持模式定义。
- JSON5:包括 ES5 中的某些生成的 JSON 超集。
- URL 查询字符串,x-www-form-urlencoded 格式。
- Starlark:由 Bazel 和 Buck 构建系统用于描述构建目标的格式。(仅序列化)
- Envy:将环境变量反序列化为 Rust 结构的一种方式。(仅反序列化)
- Envy Store:将 AWS Parameter Store 参数反序列化为 Rust 结构的一种方式。(仅反序列化)
- S-表达式:Lisp 语言系列使用的代码和数据的文本表示形式。
- D-Bus 的二进制线格式。
- FlexBuffers:Google 的 FlatBuffers 无拷贝序列化格式的无模式表兄弟。
- Bencode:BitTorrent 协议中使用的简单二进制格式。
- Token 流,用于处理 Rust 过程宏输入。(仅反序列化)
- DynamoDB 项:rusoto_dynamodb 用于与 DynamoDB 传输数据的格式。
- Hjson:围绕人类阅读和编辑而设计的 JSON 语法扩展。(仅反序列化)
serde学习
use serde::{
Serialize, Deserialize};
// `derive` may only be applied to `struct`s, `enum`s and `union`s
#[derive(Serialize, Deserialize, Debug)]
struct Animal {
name: String,
age: u32,
}
fn main() {
let animal = Animal {
name: "Dog".to_owned(),
age: 1,
};
let json_str = serde_json::to_string(&animal).unwrap();
println!("{}", json_str);
let json_str1 = r#"{"name":"Dog","age":1}"#;
// 编译器无法推断变量或函数的类型,并需要使用类型注解来明确指定类型
let animal1: Animal = serde_json::from_str(json_str1).unwrap();
println!("{:?}", animal1)
}
更新序列化的键
use serde::{
Serialize, Deserialize, Serializer, Deserializer};
#[derive(Serialize, Deserialize, Debug)]
struct Animal {
#[serde(rename = "animal_name")]
NaMe: String,
#[serde(rename = "animal_age")]
AgE: u32,
}
fn main() {
let animal = Animal {
NaMe: "Dog".to_owned(),
AgE: 1,
};
let json_str = serde_json::to_string(&animal).unwrap();
println!("{}", json_str);
let json_str1 = r#"{"animal_name":"Dog","animal_age":1}"#;
// 编译器无法推断变量或函数的类型,并需要使用类型注解来明确指定类型
let animal1: Animal = serde_json::from_str(json_str1).unwrap();
println!("{:?}", animal1)
}
打印内容如下
{
"animal_name":"DOG","animal_age":1}
Animal {
NaMe: "dog", AgE: 1 }
更新序列化的值
该场景在业务中貌似不会用到!!!
use serde::{
Serialize, Deserialize, Serializer, Deserializer};
#[derive(Serialize, Deserialize, Debug)]
struct Animal {
#[serde(serialize_with = "serialize_name", deserialize_with = "deserialize_name")]
// 上述serde仅处理Nme
NaMe: String,
AgE: u32,
}
// 使用 serde 库自定义的序列化和反序列化函数
// 在序列化和反序列化期间自定义字段的名称,并使用自定义的名称序列化和反序列化数据
fn serialize_name<S>(name: &String, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
// 将输入字符串转换为大写并序列化
serializer.serialize_str(&name.to_uppercase())
}
fn deserialize_name<'de, D>(deserializer: D) -> Result<String, D::Error>
where
D: Deserializer<'de>,
{
let name = String::deserialize(deserializer)?;
// 获取输入字符串 name,并使用 name.to_lowercase() 将其转换为小写形式
Ok(name.to_lowercase())
}
fn main() {
let animal = Animal {