Đây là thư viện dùng để serializationdeserializiton trong Rust tương tự json trong Golang, Gson in Java Nhưng có thể nói đây là một thư viện tuyệt vời nhờ cách khai báo dạng macro. Nắm vững thư viện này giúp chúng ta thao tác với dữ liệu tốt hơn

Cài đặt

cargo add serde serde_derive

Cách sử dụng

Khai báo vào đầu của mỗi struct hoặc enum


use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct Request {
    id: String,
    name: String,
    age: u32
}

Dễ phải không nào


Tính năng nâng cao

Thay đổi tên của trường (field)

Kiểu sử dụng thông dụng

Kiểu dữ liệu date/time

Kiểu dữ liệu String

Kiểu dữ liệu integer

Deep Insight

  • Serialize trait

pub trait Serialize {
    // Required method
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
       where S: Serializer;
}

Trait này có một hàm nhận vào là một kiểu Serializer trait với các hàm cơ bản như sau

pub trait Serializer: Sized {
    type Ok;
    type Error: Error;
    type SerializeSeq: SerializeSeq<Ok = Self::Ok, Error = Self::Error>;
    type SerializeTuple: SerializeTuple<Ok = Self::Ok, Error = Self::Error>;
    type SerializeTupleStruct: SerializeTupleStruct<Ok = Self::Ok, Error = Self::Error>;
    type SerializeTupleVariant: SerializeTupleVariant<Ok = Self::Ok, Error = Self::Error>;
    type SerializeMap: SerializeMap<Ok = Self::Ok, Error = Self::Error>;
    type SerializeStruct: SerializeStruct<Ok = Self::Ok, Error = Self::Error>;
    type SerializeStructVariant: SerializeStructVariant<Ok = Self::Ok, Error = Self::Error>;

    // Required methods
    fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error>;
    fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error>;
    fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error>;
    fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error>;
    fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error>;
    fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error>;
    fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error>;
    fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error>;
    fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error>;
    fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error>;
    fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error>;
    fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error>;
    fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error>;
    fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error>;
    fn serialize_none(self) -> Result<Self::Ok, Self::Error>;
    fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
    ...
  • Sử dụng cargo expand để nhìn thấy thực hiện
cd ~/project 
cargo expand > expaned.rs