[Rust] Tìm hiểu thư viện serde - P1
Đây là thư viện dùng để serialization
và deserializiton
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
Thanks for reading! Read other posts?