当前位置: 首页 > news >正文

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
serde = {version = "1", features = ["derive"]}
// 宏 日常这样写
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>whereS: 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好多年没更新了
serde_json = "1"
serde_yaml = "0.8"
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实战

{"name": "zz","age": 45,"phone": ["12223","232431"]
}
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());// 加jsonlet 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);
}

结果:

after: {"age":45,"car":{"color":"red","year":["1900","2000"]},"name":"zz","phone":["12223","232431"]}
http://www.dtcms.com/a/573751.html

相关文章:

  • 用品牌重塑秩序:短信LOGO认证打造沟通信任链
  • 网站板块策划南昌做网站和微信小程序的公司
  • 全网普盖网站建设河南asp
  • 解决 GitLab Token 轮换后 SourceTree 认证失败问题
  • SpringBoot项目实现国际化
  • Jupyter Notebook 完整安装指南
  • XPath进阶:复杂嵌套结构与条件查询的终极指南
  • Oracle AWR案例分析: 诊断‘enq: TX - row lock contention‘等待事件
  • 【云运维】Zabbix 6.0 基于 LNMP 架构部署指南
  • 企业做网站要注意些什么问题大宗交易平台查询
  • 网站安全的必要性做电影网站违法吗
  • EtherCAT、PROFINET、EtherNet/IP和Modbus TCP主要区别
  • 电脑误格式化误删除如何通过数据恢复软件免费版搭建数据恢复中心
  • 如何平衡 ToB 产品中不同客户的需求
  • 基础数据结构之数组的前缀和技巧:和为K的子数组(LeetCode 560 中等题)
  • 【基础排序】CF - 最优排列Permutator
  • [RE2] Prog对象(字节码) | Inst指令序列 | 字节映射和指令扁平化
  • 灰系网站网站运营设计
  • C++ STL::vector底层剖析
  • 多线程环境下,线程安全单例模式的方案避坑
  • 深度学习-卷积神经网络LeNet
  • Ubuntu误删libaudit.so.1 导致系统无法正常使用、崩溃
  • 【深度学习5】多层感知机
  • 通过fluent HEC 来发送数据到splunk
  • 二叉树深度解析:核心概念与算法实现
  • 考研408--操作系统--day3--调度调度算法
  • 东莞做网站首选企业铭wordpress 4.5.4 漏洞
  • 消防做ccc去那个网站微信网页版客户端下载
  • 项目实战 | 新建校区网络安全项目:从搭建到交付
  • MHAF-YOLO:用于精确目标检测的多分支异构辅助融合YOLO