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"]}
相关推荐
传奇开心果编程4 小时前
【Rust入门练中学】 第1课:从零开始
开发语言·学习·rust
Brilliantwxx4 小时前
【STM32】 SPI阻塞式通信与HAL源码(串口读ID实战)
开发语言·stm32·单片机·嵌入式硬件·ecmascript
吠品4 小时前
Nginx负载均衡配置与线上故障排查的一些经验
java·开发语言·数据库
边境悍匪5 小时前
蜗牛学苑 Java 智能体学习 Day44|Vue 前端项目搭建 思维导图复盘
java·开发语言·spring boot·学习·阿里云
wuyk5555 小时前
Python实战项目01:简易记事本系统
开发语言·python
君顾15 小时前
本地城市社区家政物业联动系统源码:架构设计与派单联动实战
java·开发语言·健身房
AI编码进化论5 小时前
云IDE介绍:环境模板化、Agent上云,云IDE该怎么选
开发语言·ide·人工智能·团队开发·ai编程
晴天的雨.9925 小时前
[C++算法]盛最多水的容器(双指针算法)
开发语言·c++·算法
泡海椒6 小时前
jquick-pdf 文本元素实战:段落、行内文本、制表符用法详解
java·开发语言·pdf
对象存储与RustFS6 小时前
跨实现迁移 MinIO→RustFS:mc diff 静默返回才是最容易翻车的一步
后端·rust·开源