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"]}
相关推荐
为何创造硅基生物5 小时前
C语言 结构体内存对齐规则(通俗易懂版)
c语言·开发语言
吃好睡好便好5 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
星寂樱易李5 小时前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
仰泳之鹅5 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
之歆5 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
cen__y6 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
AI人工智能+电脑小能手7 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
社交怪人7 小时前
【算平均分】信息学奥赛一本通C语言解法(题号2071)
c语言·开发语言
郭涤生8 小时前
不同主机之间网络通信-以太网连接复习
开发语言·rk3588
山居秋暝LS8 小时前
【无标题】RTX00安装paddle OCR,win11不能装最新的,也不能用GPU
开发语言·r语言