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"]}
相关推荐
LDR00613 小时前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术13 小时前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园13 小时前
C++20 Modules 模块详解
java·开发语言·spring
swordbob14 小时前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享14 小时前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Luminous.14 小时前
C语言--day30
c语言·开发语言
星栈14 小时前
10 分钟跑起第一个 Dioxus 应用:`dx` CLI、`rsx!` 和热更新好不好用
前端·rust·前端框架
何以解忧,唯有..14 小时前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
謓泽15 小时前
C语言不是语法,是通往机器的地图。
c语言·开发语言
云水一下15 小时前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php