政府門戶網(wǎng)站建設(shè)的意義電腦培訓(xùn)學(xué)校
由于 serde 庫(kù)默認(rèn)使用 JSON 格式進(jìn)行序列化和反序列化
因此程序?qū)⑹褂?JSON 格式對(duì)數(shù)據(jù)進(jìn)行序列化和反序列化
社區(qū)為 Serde 實(shí)現(xiàn)的部分?jǐn)?shù)據(jù)格式列表:
- JSON:廣泛使用的 JavaScript 對(duì)象符號(hào),用于許多 HTTP API
- Postcard:no_std 和嵌入式系統(tǒng)友好的緊湊二進(jìn)制格式。
- CBOR:用于小消息大小且無(wú)需版本協(xié)商的簡(jiǎn)潔二進(jìn)制對(duì)象表示法。
- YAML:自稱為“人類友好”的配置語(yǔ)言(不是標(biāo)記語(yǔ)言)。
- MessagePack:類似于緊湊 JSON 的高效二進(jìn)制格式。
- TOML:Cargo 使用的最小配置格式。
- Pickle:Python 世界中常見(jiàn)的格式。
- RON:一種 Rust 對(duì)象表示法。
- BSON:MongoDB 使用的數(shù)據(jù)存儲(chǔ)和網(wǎng)絡(luò)傳輸格式。
- Avro:用于 Apache Hadoop 內(nèi)部的二進(jìn)制格式,支持模式定義。
- JSON5:包括 ES5 中的某些生成的 JSON 超集。
- URL 查詢字符串,x-www-form-urlencoded 格式。
- Starlark:由 Bazel 和 Buck 構(gòu)建系統(tǒng)用于描述構(gòu)建目標(biāo)的格式。(僅序列化)
- Envy:將環(huán)境變量反序列化為 Rust 結(jié)構(gòu)的一種方式。(僅反序列化)
- Envy Store:將 AWS Parameter Store 參數(shù)反序列化為 Rust 結(jié)構(gòu)的一種方式。(僅反序列化)
- S-表達(dá)式:Lisp 語(yǔ)言系列使用的代碼和數(shù)據(jù)的文本表示形式。
- D-Bus 的二進(jìn)制線格式。
- FlexBuffers:Google 的 FlatBuffers 無(wú)拷貝序列化格式的無(wú)模式表兄弟。
- Bencode:BitTorrent 協(xié)議中使用的簡(jiǎn)單二進(jìn)制格式。
- Token 流,用于處理 Rust 過(guò)程宏輸入。(僅反序列化)
- DynamoDB 項(xiàng):rusoto_dynamodb 用于與 DynamoDB 傳輸數(shù)據(jù)的格式。
- Hjson:圍繞人類閱讀和編輯而設(shè)計(jì)的 JSON 語(yǔ)法擴(kuò)展。(僅反序列化)
serde學(xué)習(xí)
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}"#;// 編譯器無(wú)法推斷變量或函數(shù)的類型,并需要使用類型注解來(lái)明確指定類型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}"#;// 編譯器無(wú)法推斷變量或函數(shù)的類型,并需要使用類型注解來(lái)明確指定類型let animal1: Animal = serde_json::from_str(json_str1).unwrap();println!("{:?}", animal1)
}
打印內(nèi)容如下
{"animal_name":"DOG","animal_age":1}
Animal { NaMe: "dog", AgE: 1 }
更新序列化的值
該場(chǎng)景在業(yè)務(wù)中貌似不會(huì)用到?。?!
use serde::{Serialize, Deserialize, Serializer, Deserializer};#[derive(Serialize, Deserialize, Debug)]
struct Animal {#[serde(serialize_with = "serialize_name", deserialize_with = "deserialize_name")]// 上述serde僅處理NmeNaMe: String,AgE: u32,
}// 使用 serde 庫(kù)自定義的序列化和反序列化函數(shù)
// 在序列化和反序列化期間自定義字段的名稱,并使用自定義的名稱序列化和反序列化數(shù)據(jù)
fn serialize_name<S>(name: &String, serializer: S) -> Result<S::Ok, S::Error>
whereS: Serializer,
{// 將輸入字符串轉(zhuǎn)換為大寫(xiě)并序列化serializer.serialize_str(&name.to_uppercase())
}fn deserialize_name<'de, D>(deserializer: D) -> Result<String, D::Error>
whereD: Deserializer<'de>,
{let name = String::deserialize(deserializer)?;// 獲取輸入字符串 name,并使用 name.to_lowercase() 將其轉(zhuǎn)換為小寫(xiě)形式Ok(name.to_lowercase())
}fn main() {let animal = Animal {