那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用Serde進(jìn)行序列化和反序列化

科技綠洲 ? 來源:TinyZ ? 作者:TinyZ ? 2023-09-30 17:09 ? 次閱讀

Serde 是一個(gè)用于序列化和反序列化 Rust 數(shù)據(jù)結(jié)構(gòu)的庫。它支持 JSON、BSON、YAML 等多種格式,并且可以自定義序列化和反序列化方式。Serde 的特點(diǎn)是代碼簡(jiǎn)潔、易于使用、性能高效。它是 Rust 生態(tài)中最受歡迎的序列化庫之一。

基礎(chǔ)用法

安裝

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

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

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

序列化

使用 Serde 進(jìn)行序列化,需要先將數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)serde::Serialize trait。例如,我們定義一個(gè)Animal結(jié)構(gòu)體,包含名稱和年齡兩個(gè)字段:

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

然后,我們可以使用serde_json庫將Animal結(jié)構(gòu)體序列化為 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 進(jìn)行反序列化,需要先將數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)serde::Deserialize trait。例如,我們定義一個(gè)Animal結(jié)構(gòu)體,包含名稱和年齡兩個(gè)字段:

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

然后,我們可以使用serde_json庫將 JSON 字符串反序列化為Animal結(jié)構(gòu)體:

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 }

進(jìn)階用法

自定義序列化和反序列化

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

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結(jié)構(gòu)體中,我們使用#[serde(serialize_with = "serialize_name", deserialize_with = "deserialize_name")]指定了自定義的序列化和反序列化方法。serialize_name函數(shù)將名稱轉(zhuǎn)換為大寫字母,deserialize_name函數(shù)將名稱轉(zhuǎn)換為小寫字母。

序列化和反序列化枚舉

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

use serde::{Serialize, Deserialize};

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

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

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 }

序列化和反序列化結(jié)構(gòu)體中的 Option

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

use serde::{Serialize, Deserialize};

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

在序列化和反序列化結(jié)構(gòu)體中的Option類型時(shí),需要使用#[serde(skip_serializing_if = "Option::is_none")]指定當(dāng)Option值為None時(shí),不進(jìn)行序列化。例如:

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 }

序列化和反序列化結(jié)構(gòu)體中的 Vec

Serde 支持序列化和反序列化結(jié)構(gòu)體中的Vec類型。例如,我們定義一個(gè)Zoo結(jié)構(gòu)體,包含多個(gè)Animal

use serde::{Serialize, Deserialize};

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

在序列化和反序列化結(jié)構(gòu)體中的Vec類型時(shí),Serde 會(huì)自動(dòng)處理序列化和反序列化。例如:

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 }] }

序列化和反序列化結(jié)構(gòu)體中的 HashMap

Serde 支持序列化和反序列化結(jié)構(gòu)體中的HashMap類型。例如,我們定義一個(gè)Zoo結(jié)構(gòu)體,包含多個(gè)Animal,使用HashMap存儲(chǔ):

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

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

在序列化和反序列化結(jié)構(gòu)體中的HashMap類型時(shí),Serde 會(huì)自動(dòng)處理序列化和反序列化。例如:

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 }} }

總結(jié)

教程介紹了如何使用 Serde 進(jìn)行序列化和反序列化,并且介紹了如何自定義序列化和反序列化邏輯。使用 Serde 可以輕松地將 Rust 數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為任何格式,并且可以通過自定義序列化和反序列化邏輯實(shí)現(xiàn)更高級(jí)的功能。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4346

    瀏覽量

    62968
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4825

    瀏覽量

    69041
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    573

    瀏覽量

    40230
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Java序列化的機(jī)制和原理

    對(duì)象的序列化反序列化也算是Java基礎(chǔ)的一部分,下面對(duì)Java序列化的機(jī)制和原理進(jìn)行一些介紹。Java序列化算法透析Serializati
    發(fā)表于 07-10 07:27

    Virtex ISERDES_NODELAY對(duì)快速4線總線進(jìn)行反序列化怎么實(shí)現(xiàn)?

    你好朋友。我想使用Virtex ISERDES_NODELAY對(duì)快速4線總線進(jìn)行反序列化。總線大約為700 MHz。我想確保反序列化的信號(hào)不是異相的。我的意思是,如果其中一個(gè)ISERDES由于內(nèi)部路由延遲而稍后將復(fù)位,則
    發(fā)表于 06-01 16:54

    c語言序列化反序列化有何區(qū)別

    這里寫自定義目錄標(biāo)題c語言序列化反序列化tplut.htplut.c測(cè)試代碼參考c語言序列化反序列化網(wǎng)絡(luò)調(diào)用,數(shù)據(jù)傳輸都需要把數(shù)據(jù)序列化
    發(fā)表于 07-14 07:32

    關(guān)于c語言序列化反序列化的知識(shí)點(diǎn)看完你就懂了

    關(guān)于c語言序列反序列化的知識(shí)點(diǎn)你就懂了
    發(fā)表于 10-15 08:47

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

    執(zhí)行trim方法進(jìn)行處理。此方案只有逐個(gè)添加注解,工作量較大。方案:實(shí)現(xiàn)ObjectDeserializer接口ObjectDeserializer接口為可以實(shí)現(xiàn)自定義反序列化實(shí)現(xiàn)接口,配合
    發(fā)表于 10-10 16:02

    理解PHP反序列化漏洞

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

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

    一、序列化反序列化的概念 把對(duì)象轉(zhuǎn)換為字節(jié)序列的過程稱為對(duì)象的序列化。 把字節(jié)序列恢復(fù)為對(duì)象的過程稱為對(duì)象的
    發(fā)表于 09-27 10:13 ?6次下載

    MAX9278和MAX9282 3.12Gbps的GMSL反序列化器的應(yīng)用和數(shù)據(jù)手冊(cè)免費(fèi)下載

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

    static屬性為什么不會(huì)被序列化

    實(shí)現(xiàn)序列化反序列化為什么要實(shí)現(xiàn)Serializable接口?
    的頭像 發(fā)表于 07-15 11:03 ?1816次閱讀

    基于反序列化過采樣數(shù)據(jù)的時(shí)鐘和數(shù)據(jù)恢復(fù)單元

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

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

    什么是序列化? “序列化”(Serialization )的意思是將一個(gè)對(duì)象轉(zhuǎn)化為字節(jié)流。 這里說的對(duì)象可以理解為“面向?qū)ο蟆崩锏哪莻€(gè)對(duì)象,具體的就是存儲(chǔ)在內(nèi)存中的對(duì)象數(shù)據(jù)。 與之相反的過程是“反序列化
    的頭像 發(fā)表于 09-14 17:22 ?2675次閱讀
    什么是<b class='flag-5'>序列化</b> 為什么要<b class='flag-5'>序列化</b>

    ROS中的序列化實(shí)現(xiàn)

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

    如何用C語言進(jìn)行json的序列化反序列化

    json是目前最為流行的文本數(shù)據(jù)傳輸格式,特別是在網(wǎng)絡(luò)通信上廣泛應(yīng)用,隨著物聯(lián)網(wǎng)的興起,在嵌入式設(shè)備上,也需要開始使用json進(jìn)行數(shù)據(jù)傳輸,那么,如何快速簡(jiǎn)潔地用C語言進(jìn)行json的序列化
    的頭像 發(fā)表于 10-07 11:05 ?1574次閱讀

    Spring Boot時(shí)配置JSON序列化選項(xiàng)的幾種方法

    在Spring Boot Web 項(xiàng)目中,當(dāng)使用JSON格式接收數(shù)據(jù)和返回?cái)?shù)據(jù)的時(shí)候,Spring Boot 默認(rèn)使用一個(gè)ObjectMapper實(shí)例來序列化響應(yīng)和反序列化請(qǐng)求。 在本文中,我們將
    的頭像 發(fā)表于 10-09 10:26 ?2286次閱讀

    Java序列化怎么使用

    轉(zhuǎn)換方式就叫做序列化。將文件或者網(wǎng)絡(luò)傳輸中得到的 byte[] 數(shù)組轉(zhuǎn)換為 java 對(duì)象就叫做反序列化。 怎么使用 如果一個(gè) Java 對(duì)象要能被序列化,必須實(shí)現(xiàn)一個(gè)特殊
    的頭像 發(fā)表于 10-10 14:19 ?481次閱讀
    真人百家乐赌场娱乐网规则 | 威尼斯人娱乐城网络博彩| 大发888客户端官方下载| 网上大发扑克| 皇冠百家乐官网皇冠网| 百家乐官网发牌器8副| 郑州百家乐官网的玩法技巧和规则| 饿火命适合做生意吗| 模拟百家乐的玩法技巧和规则| 金宝博188| 百家乐官网技巧头头娱乐| 财神娱乐城打不开| 宝格丽百家乐官网娱乐城| 太阳百家乐官网网| 中原百家乐的玩法技巧和规则| 真钱博彩网| 米脂县| 百家乐官网网络赌博地址| 百家乐玩法有技巧| 大发888官网注册送58| 百家乐官网平台哪个有在线支付呢| 百家乐游戏真钱游戏| 大发888 赌场娱乐网规则| 菲律宾百家乐官网的说法| 宝龙百家乐娱乐城| 大发888娱乐城外挂| 百家乐官网5式直缆投注法| ez百家乐技巧| 真人轮盘| 百家乐官网筹码防伪| 大发888 dafa888 octbay| 百家乐官网模拟分析程序| 缅甸百家乐赌博现场下载| 澳门顶级赌场国际| 百家乐官网娱乐优惠| 明珠百家乐的玩法技巧和规则| 怎样玩百家乐官网赢钱| 百家乐双倍派彩的娱乐城| 阳新县| 百家乐真人游戏投注网| 百家乐试用软件|