在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    4346

    瀏覽量

    62971
  • 代碼
    +關注

    關注

    30

    文章

    4825

    瀏覽量

    69048
  • 數據結構
    +關注

    關注

    3

    文章

    573

    瀏覽量

    40232
收藏 人收藏

    評論

    相關推薦

    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次下載

    MAX9278和MAX9282 3.12Gbps的GMSL反序列化器的應用和數據手冊免費下載

    MAX9278和MAX9282千兆位多媒體串行鏈路(GMSL)反序列化器通過50Ω同軸電纜或100Ω屏蔽雙絞線(STP)電纜從GMSL串行器接收數據,并在4個數據通道LVDS輸出(oLDI)中的3個上輸出反序列化數據。
    發表于 08-24 08:00 ?35次下載
    MAX9278和MAX9282 3.12Gbps的GMSL<b class='flag-5'>反序列化</b>器的應用和數據手冊免費下載

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

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

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

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

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

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

    ROS中的序列化實現

    理解了序列化,再回到ROS。我們發現,ROS沒有采用第三方的序列化工具,而是選擇自己實現,代碼在roscpp_core項目下的roscpp_serialization中,見下圖。這個功能涉及的代碼量
    的頭像 發表于 09-14 17:26 ?961次閱讀

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

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

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

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

    Java序列化怎么使用

    轉換方式就叫做序列化。將文件或者網絡傳輸中得到的 byte[] 數組轉換為 java 對象就叫做反序列化。 怎么使用 如果一個 Java 對象要能被序列化,必須實現一個特殊
    的頭像 發表于 10-10 14:19 ?483次閱讀
    主站蜘蛛池模板: 成人国产精品一级毛片视频 | 人人干97 | www.黄色一片| 19xxxxxxxxx日本69| 你懂的国产 | 免费黄色小视频 | 欧美激情五月 | 殴美一级| 亚洲色图综合网站 | 刺激第一页720lu久久 | 欧美性video精品 | 尻逼久久| 五月婷婷激情视频 | 35pao免费视频 | 综合色影院| 日本一级成人毛片免费观看 | 午夜视频播放 | 午夜观看 | 欧美黄色片视频 | 色视频亚洲 | 2022欧美高清中文字幕在线看 | 国内精品免费视频自在线 | 色综合啪啪| 日本丶国产丶欧美色综合 | 我要看黄色一级毛片 | www干| 日韩一级视频免费观看 | 四虎影视最新地址 | 我想看一级黄色片 | 免费性bbbb台湾| 香蕉视频在线免费播放 | 91精品国产亚洲爽啪在线影院 | 18女人毛片水真多免费 | 五月天婷婷在线播放 | 3344免费播放观看视频 | 韩国免费人成在线观看网站 | 黄色一级a毛片 | 亚洲第一在线 | 国产精品福利午夜在线观看 | 久久黄色毛片 | 日本美女搞黄 |