由于 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(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")] |
| |
| NaMe: String, |
| AgE: u32, |
| } |
| |
| |
| |
| 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)?; |
| |
| Ok(name.to_lowercase()) |
| } |
| |
| fn main() { |
| |
| let animal = Animal { |
| |
复制