伦伦影院久久影视,天天操天天干天天射,ririsao久久精品一区 ,一本大道香蕉大久在红桃,999久久久免费精品国产色夜,色悠悠久久综合88,亚洲国产精品久久无套麻豆,亚洲香蕉毛片久久网站,一本一道久久综合狠狠老

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何使用Serde進行序列化和反序列化

科技綠洲 ? 來源:TinyZ ? 作者:TinyZ ? 2023-09-30 17:09 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Serde 是一個用于序列化和反序列化 Rust 數據結構的庫。它支持 JSON、BSON、YAML 等多種格式,并且可以自定義序列化和反序列化方式。Serde 的特點是代碼簡潔、易于使用、性能高效。它是 Rust 生態中最受歡迎的序列化庫之一。

基礎用法

安裝

在 Rust 項目中使用 Serde,需要在Cargo.toml文件中添加如下依賴:

[dependencies]
serde = { version = "1.0", features = ["derive"] }

其中features = ["derive"]表示使用 Serde 的派生宏,可以自動生成序列化和反序列化代碼。

序列化

使用 Serde 進行序列化,需要先將數據結構實現serde::Serialize trait。例如,我們定義一個Animal結構體,包含名稱和年齡兩個字段:

#[derive(Serialize)]
struct Animal {
    name: String,
    age: u32,
}

然后,我們可以使用serde_json庫將Animal結構體序列化為 JSON 字符串:

use serde_json;

let animal = Animal {
    name: "Tom".to_owned(),
    age: 3,
};
let json = serde_json::to_string(&animal).unwrap();
println!("{}", json); // {"name":"Tom","age":3}

反序列化

使用 Serde 進行反序列化,需要先將數據結構實現serde::Deserialize trait。例如,我們定義一個Animal結構體,包含名稱和年齡兩個字段:

#[derive(Deserialize)]
struct Animal {
    name: String,
    age: u32,
}

然后,我們可以使用serde_json庫將 JSON 字符串反序列化為Animal結構體:

use serde_json;

let json = r#"{"name":"Tom","age":3}"#;
let animal: Animal = serde_json::from_str(json).unwrap();
println!("{:?}", animal); // Animal { name: "Tom", age: 3 }

進階用法

自定義序列化和反序列化

如果默認的序列化和反序列化方式無法滿足需求,可以自定義序列化和反序列化方式。例如,我們定義一個Animal結構體,包含名稱和年齡兩個字段,但是希望在序列化時,將名稱轉換為大寫字母,反序列化時,將名稱轉換為小寫字母:

use serde::{Serialize, Deserialize, Serializer, Deserializer};

#[derive(Serialize, Deserialize)]
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())
}

Animal結構體中,我們使用#[serde(serialize_with = "serialize_name", deserialize_with = "deserialize_name")]指定了自定義的序列化和反序列化方法。serialize_name函數將名稱轉換為大寫字母,deserialize_name函數將名稱轉換為小寫字母。

序列化和反序列化枚舉

Serde 支持序列化和反序列化枚舉類型。例如,我們定義一個Animal枚舉,包含狗和貓兩種類型:

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
enum Animal {
    Dog { name: String, age: u32 },
    Cat { name: String, age: u32 },
}

在序列化和反序列化枚舉類型時,需要使用#[serde(tag = "type")]指定枚舉類型的標簽,例如:

use serde_json;

let dog = Animal::Dog { name: "Tom".to_owned(), age: 3 };
let json = serde_json::to_string(&dog).unwrap();
println!("{}", json); // {"type":"Dog","name":"Tom","age":3}

let json = r#"{"type":"Dog","name":"Tom","age":3}"#;
let dog: Animal = serde_json::from_str(json).unwrap();
println!("{:?}", dog); // Dog { name: "Tom", age: 3 }

序列化和反序列化結構體中的 Option

Serde 支持序列化和反序列化結構體中的Option類型。例如,我們定義一個Animal結構體,包含名稱和年齡兩個字段,其中名稱可以為空:

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct Animal {
    name: Option< String >,
    age: u32,
}

在序列化和反序列化結構體中的Option類型時,需要使用#[serde(skip_serializing_if = "Option::is_none")]指定當Option值為None時,不進行序列化。例如:

use serde_json;

let animal = Animal { name: Some("Tom".to_owned()), age: 3 };
let json = serde_json::to_string(&animal).unwrap();
println!("{}", json); // {"name":"Tom","age":3}

let animal = Animal { name: None, age: 3 };
let json = serde_json::to_string(&animal).unwrap();
println!("{}", json); // {"age":3}

let json = r#"{"age":3}"#;
let animal: Animal = serde_json::from_str(json).unwrap();
println!("{:?}", animal); // Animal { name: None, age: 3 }

序列化和反序列化結構體中的 Vec

Serde 支持序列化和反序列化結構體中的Vec類型。例如,我們定義一個Zoo結構體,包含多個Animal

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct Zoo {
    animals: Vec< Animal >,
}

在序列化和反序列化結構體中的Vec類型時,Serde 會自動處理序列化和反序列化。例如:

use serde_json;

let zoo = Zoo { animals: vec![
    Animal { name: "Tom".to_owned(), age: 3 },
    Animal { name: "Jerry".to_owned(), age: 2 },
] };
let json = serde_json::to_string(&zoo).unwrap();
println!("{}", json); // {"animals":[{"name":"Tom","age":3},{"name":"Jerry","age":2}]}

let json = r#"{"animals":[{"name":"Tom","age":3},{"name":"Jerry","age":2}]}"#;
let zoo: Zoo = serde_json::from_str(json).unwrap();
println!("{:?}", zoo); // Zoo { animals: [Animal { name: "Tom", age: 3 }, Animal { name: "Jerry", age: 2 }] }

序列化和反序列化結構體中的 HashMap

Serde 支持序列化和反序列化結構體中的HashMap類型。例如,我們定義一個Zoo結構體,包含多個Animal,使用HashMap存儲:

use std::collections::HashMap;
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct Zoo {
    animals: HashMap< String, Animal >,
}

在序列化和反序列化結構體中的HashMap類型時,Serde 會自動處理序列化和反序列化。例如:

use serde_json;

let mut animals = HashMap::new();
animals.insert("Tom".to_owned(), Animal { name: "Tom".to_owned(), age: 3 });
animals.insert("Jerry".to_owned(), Animal { name: "Jerry".to_owned(), age: 2 });
let zoo = Zoo { animals };
let json = serde_json::to_string(&zoo).unwrap();
println!("{}", json); // {"animals":{"Jerry":{"name":"Jerry","age":2},"Tom":{"name":"Tom","age":3}}}

let json = r#"{"animals":{"Jerry":{"name":"Jerry","age":2},"Tom":{"name":"Tom","age":3}}}"#;
let zoo: Zoo = serde_json::from_str(json).unwrap();
println!("{:?}", zoo); // Zoo { animals: {"Tom": Animal { name: "Tom", age: 3 }, "Jerry": Animal { name: "Jerry", age: 2 }} }

總結

本教程介紹了如何使用 Serde 進行序列化和反序列化,并且介紹了如何自定義序列化和反序列化邏輯。使用 Serde 可以輕松地將 Rust 數據結構轉換為任何格式,并且可以通過自定義序列化和反序列化邏輯實現更高級的功能。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4419

    瀏覽量

    67717
  • 代碼
    +關注

    關注

    30

    文章

    4974

    瀏覽量

    74216
  • 數據結構
    +關注

    關注

    3

    文章

    573

    瀏覽量

    41653
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Java序列化的機制和原理

    對象的序列化反序列化也算是Java基礎的一部分,下面對Java序列化的機制和原理進行一些介紹。Java序列化算法透析Serializati
    發表于 07-10 07:27

    Virtex ISERDES_NODELAY對快速4線總線進行反序列化怎么實現?

    你好朋友。我想使用Virtex ISERDES_NODELAY對快速4線總線進行反序列化??偩€大約為700 MHz。我想確保反序列化的信號不是異相的。我的意思是,如果其中一個ISERDES由于內部路由延遲而稍后將復位,則
    發表于 06-01 16:54

    c語言序列化反序列化有何區別

    這里寫自定義目錄標題c語言序列化反序列化tplut.htplut.c測試代碼參考c語言序列化反序列化網絡調用,數據傳輸都需要把數據序列化
    發表于 07-14 07:32

    關于c語言序列化反序列化的知識點看完你就懂了

    關于c語言序列反序列化的知識點你就懂了
    發表于 10-15 08:47

    SpringMVC JSON框架的自定義序列化反序列化

    執行trim方法進行處理。此方案只有逐個添加注解,工作量較大。方案:實現ObjectDeserializer接口ObjectDeserializer接口為可以實現自定義反序列化實現接口,配合
    發表于 10-10 16:02

    理解PHP反序列化漏洞

    理解PHP反序列化漏洞
    發表于 09-07 11:03 ?7次下載
    理解PHP<b class='flag-5'>反序列化</b>漏洞

    java序列化反序列化范例和JDK類庫中的序列化API

    一、序列化反序列化的概念 把對象轉換為字節序列的過程稱為對象的序列化。 把字節序列恢復為對象的過程稱為對象的
    發表于 09-27 10:13 ?6次下載

    static屬性為什么不會被序列化

    實現序列化反序列化為什么要實現Serializable接口?
    的頭像 發表于 07-15 11:03 ?2511次閱讀

    基于反序列化過采樣數據的時鐘和數據恢復單元

    電子發燒友網站提供《基于反序列化過采樣數據的時鐘和數據恢復單元.pdf》資料免費下載
    發表于 09-13 10:41 ?0次下載
    基于<b class='flag-5'>反序列化</b>過采樣數據的時鐘和數據恢復單元

    什么是序列化 為什么要序列化

    什么是序列化? “序列化”(Serialization )的意思是將一個對象轉化為字節流。 這里說的對象可以理解為“面向對象”里的那個對象,具體的就是存儲在內存中的對象數據。 與之相反的過程是“反序列化
    的頭像 發表于 09-14 17:22 ?4076次閱讀
    什么是<b class='flag-5'>序列化</b> 為什么要<b class='flag-5'>序列化</b>

    如何用C語言進行json的序列化反序列化

    json是目前最為流行的文本數據傳輸格式,特別是在網絡通信上廣泛應用,隨著物聯網的興起,在嵌入式設備上,也需要開始使用json進行數據傳輸,那么,如何快速簡潔地用C語言進行json的序列化
    的頭像 發表于 10-07 11:05 ?2568次閱讀

    Spring Boot時配置JSON序列化選項的幾種方法

    在Spring Boot Web 項目中,當使用JSON格式接收數據和返回數據的時候,Spring Boot 默認使用一個ObjectMapper實例來序列化響應和反序列化請求。 在本文中,我們將
    的頭像 發表于 10-09 10:26 ?3510次閱讀

    Java序列化怎么使用

    轉換方式就叫做序列化。將文件或者網絡傳輸中得到的 byte[] 數組轉換為 java 對象就叫做反序列化。 怎么使用 如果一個 Java 對象要能被序列化,必須實現一個特殊
    的頭像 發表于 10-10 14:19 ?1126次閱讀

    極簡代碼,搞定JSON序列化反序列化

    快速實現JSON數據的生成(序列化)與解析(反序列化)。 目前json庫已全面支持LuatOS開發系列產品,開發者可根據項目實際需求,靈活選用并進行快速集成與開發。 一、 JSON基礎要點 在
    的頭像 發表于 02-23 21:46 ?394次閱讀
    極簡代碼,搞定JSON<b class='flag-5'>序列化</b>與<b class='flag-5'>反序列化</b>

    JSON:簡潔代碼高效搞定序列化反序列化

    面對頻繁的數據交互需求,用最簡方式實現JSON序列化反序列化已成為開發者必備技能,借助主流庫,輕松實現零負擔數據轉換。JSON(JavaScriptObjectNotation)是一種輕量級
    的頭像 發表于 02-25 19:04 ?167次閱讀
    JSON:簡潔代碼高效搞定<b class='flag-5'>序列化</b>與<b class='flag-5'>反序列化</b>