serde

Serde

Serde: 是 rust 语言用来序列化和反序列化数据的解决方案

  • 体现了定义与实现分离的设计思想
  • serde 基于 rust 的 trait 来实现自己的序列化
  • 具有较好的性能

Serialization Deserialization

  • 一个是将内存中的数据结构或对象转换成二进制序列的过程使其可以用于网络传输或是保存到本地
  • 一个是将在序列化过程中所生成的二进制序列转换成数据结构或者对象的过程,实际上就是一个相反的过程

Serializer:serde_json、serde_yaml

  • Serialize 定义 && Serializer 实现
  • Serde 提供一个宏 serde_derive 自动的为结构体类型和枚举类型生成 Serialize 和 Deserialize 实现
    • #[derive(Serialize)]
  • 但是 Serde 没有实现 Serializer Deserializer
    • 一般情况下我们用第三方库来实现 Serializer、Deserializer
rust 复制代码
serde = {version = "1", features = ["derive"]}
rust 复制代码
// 宏 日常这样写
use serde::Serialize;

#[derive(Serialize)]
struct Person {
    name: String,
    age: u8,
    phones: Vec<String>,
}

// 手动实现(演示上面干了什么)
// 这种方法和上面等效
use serde::ser::{Serialize, SerializeStruct};
struct Person {
    name: String,
    age: u8,
    phones: Vec<String>,
}
impl Serialize for Person {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        let mut s = serializer.serialize_struct("person", 3)?;
        s.serialize_field("name", &self.name)?;
        s.serialize_field("age", &self.age)?;
        s.serialize_field("phones", &self.phones)?;
        s.end()
    }
}

Serde、Json、Yaml实战

  • Json和Yaml用的比较多
  • Xml好多年没更新了
rust 复制代码
serde_json = "1"
serde_yaml = "0.8"
rust 复制代码
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize, Debug)]
struct Pay {
    amount: i32,
    tax_percent: f32,
}

#[derive(Serialize, Deserialize, Debug)]
struct Person {
    name: String,
    age: u8,
    phone: String,
    pays: Vec<Pay>,
}

fn main() {
    let ps = vec![Person{
        name: "zz".to_string(),
        age: 45,
        phone: "2324".to_string(),
        pays: vec![
            Pay {
                amount: 100,
                tax_percent: 0.1,
            },
            Pay {
                amount: 200,
                tax_percent: 0.2,
            }
        ]
    }];
    let json_str = serde_json::to_string_pretty(&ps).unwrap();
    let yaml_str = serde_yaml::to_string(&ps).unwrap();
    println!("json: {}", json_str);
    println!("yaml: {}", yaml_str);

    let ps_json: Vec<Person> = serde_json::from_str(json_str.as_str()).unwrap();
    let ps_yaml: Vec<Person> = serde_yaml::from_str(yaml_str.as_str()).unwrap();
    println!("{:?}", ps_json);
    println!("{:?}", ps_yaml);
}

修改Json实战

json 复制代码
{
  "name": "zz",
  "age": 45,
  "phone": [
    "12223",
    "232431"
  ]
}
rust 复制代码
fn main() {
    let json_data = std::fs::read_to_string("./data.json").unwrap();
    let mut data: serde_json::Value = serde_json::from_str(json_data.as_str()).unwrap();
    println!("before: {}", data);
    // 加字段
    data["car"] = serde_json::Value::String("fdd".to_string());
    // 加json
    let mut map_value = serde_json::Map::new();
    map_value.insert(
        "color".to_string(),
        serde_json::Value::String("red".to_string())
    );
    map_value.insert(
        "year".to_string(),
        serde_json::Value::Array(vec![
            serde_json::Value::String("1900".to_string()),
            serde_json::Value::String("2000".to_string()),
        ]),
    );
    data["car"] = serde_json::Value::Object(map_value);

    println!("after: {}", data);
}

结果:

json 复制代码
after: {"age":45,"car":{"color":"red","year":["1900","2000"]},"name":"zz","phone":["12223","232431"]}
相关推荐
MediaTea4 小时前
Python 文件操作:JSON 格式
开发语言·windows·python·json
2501_930707784 小时前
使用C#代码添加或删除PPT页面
开发语言·c#·powerpoint
百锦再4 小时前
金仓数据库提出“三低一平”的迁移理念
开发语言·数据库·后端·python·rust·eclipse·pygame
茉莉玫瑰花茶4 小时前
从零搭建 C++ 在线五子棋对战项目:从环境到上线,全流程保姆级教程
开发语言·c++
卡卡酷卡BUG4 小时前
2025年Java面试题及详细解答(MySQL篇)
java·开发语言·mysql
野生工程师4 小时前
【Python爬虫基础-1】爬虫开发基础
开发语言·爬虫·python
wuwu_q4 小时前
彻底讲清楚 Kotlin 的 when 表达式
android·开发语言·kotlin
北城以北88884 小时前
SSM--MyBatis框架之动态SQL
java·开发语言·数据库·sql·mybatis
木易 士心5 小时前
Android 开发核心技术深度解析
android·开发语言·python