We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
serder version: 1.0 rust version 1.41 (1.31+)
参考
创建测试项目 cargo new serde-learn --lib
cargo new serde-learn --lib
依赖 Cargo.toml
Cargo.toml
serde = { version = "1.0", features = ["derive"] } serde_json = "1.0"
Serde 是 Rust 生态中最主流的 序列化、反序列化框架
设计上,基于 Rust 的静态类型系统和元编程(宏)的能力,使 Serde 序列化的执行速度与手写序列化器的速度相同。
使用上及其简单
Serialize
Deserialize
derive
Serializer
Deserializer
Serde 及社区提供主流的序列化协议的支持,具体如下
Serde 对常见 Rust 标准库数据结构 提供了开箱即用的实现。例如:String, &str, usize, Vec<T>, HashMap<K,V>。
String
&str
usize
Vec<T>
HashMap<K,V>
对于自定义类型可以通过 派生宏 提供支持
src/ch01_overview.rs
use serde::{Serialize, Deserialize}; #[derive(Serialize, Deserialize, Debug)] struct Point { x: i32, y: i32, } #[cfg(test)] mod tests { use super::*; #[test] fn it_works() { let point = Point { x: 1, y: 2 }; let serialized = serde_json::to_string(&point).unwrap(); println!("serialized = {}", serialized); let deserialized: Point = serde_json::from_str(&serialized).unwrap(); println!("deserialized = {:?}", deserialized); } }
Serde 数据模型是 与 Rust 数据结构和数据格式进行交互的 API。您可以将其视为 Serde 的类型系统,Serde 将 Rust 类型分为 29 种
\0
[u8]
()
struct Unit
PhantomData<T>
enum E {A, B}
E::A
E::B
struct Millimeters(u8)
enum E {N(u8) }
E::N
HashSet<T>
vec![Value::Bool(true), Value::Char('c')]
(u8,)
(String, u64, Vec<T>)
[u64; 10]
struct Rgb(u8, u8, u8)
enum E {T(u8, u8) }
E::T
BTreeMap <K, V>
struct S {r: u8, g: u8, b: u8}
enum E {S { r: u8, g: u8, b: u8} }
E::S
对于大多数 Rust 类型,将它们映射到 Serde 数据模型中非常简单。例如,Rust bool 类型对应于 Serde 的 bool 类型。Rust 元组结构 Rgb(u8, u8, u8) 对应于 Serde 的元组结构类型。
Rgb(u8, u8, u8)
但是不一定就是这种简单一一对应的映射,例如:
std::ffi::OsString 类型,在 Windows 和 Unix 下表现不一致。直觉上应该映射为 string,但是跨平台无法使用。因此更好的方案是:
std::ffi::OsString
string
enum OsString { Unix(Vec<u8>), Windows(Vec<u16>), }
实例细节参见: https://github.com/serde-rs/serde/blob/master/test_suite/tests/test_gen.rs
参见:一、总览 2、数据结构
属性用于使用派生宏的一些配置,主要分为 3 类:
容器属性 Container attributes — 应用在 枚举 和 结构体
Variant 属性 Variant attributes — 应用在 枚举的 Variant 上
字段属性 Field attributes — 应用在 结构体 和 枚举 variant 的 字段上
#[derive(Serialize, Deserialize)] #[serde(deny_unknown_fields)] struct S { #[serde(default)] f: i32, } #[derive(Serialize, Deserialize)] #[serde(rename = "e")] enum E { #[serde(rename = "a")] A(String), }
#[serde(rename = "name")]
#[serde(rename(serialize = "ser_name"))]
#[serde(rename(deserialize = "de_name"))]
#[serde(rename(serialize = "ser_name", deserialize = "de_name"))]
#[serde(rename_all = "...")]
"..."
"lowercase"
"UPPERCASE"
"PascalCase"
"camelCase"
"snake_case"
"SCREAMING_SNAKE_CASE"
"kebab-case"
"SCREAMING-KEBAB-CASE"
#[serde(rename_all(serialize = "..."))]
#[serde(rename_all(deserialize = "..."))]
#[serde(rename_all(serialize = "...", deserialize = "..."))]
#[serde(deny_unknown_fields)]
#[serde(tag = "type")]
#[serde(tag = "t", content = "c")]
#[serde(untagged)]
#[serde(bound = "T: MyTrait")]
#[serde(bound(serialize = "T: MySerTrait"))]
#[serde(bound(deserialize = "T: MyDeTrait"))]
#[serde(bound(serialize = "T: MySerTrait", deserialize = "T: MyDeTrait"))]
#[serde(default)]
#[serde(default = "path")]
fn()->T
default="my_default"
my_default()
default = "SomeTrait::some_default"
SomeTrait::some_default()
#[serde(remote = "...")]
#[serde(transparent)]
只允许应用在只有一个字段枚举或者结构体上
表示只序列化内部对象,不要外部支撑,比如
#[derive(Serialize, Deserialize, Debug)] #[serde(transparent)] struct Axis { x: i32 }
#[serde(from = "FromType")]
FromType
From<FromType>
#[serde(try_from = "FromType")]
TryFrom<FromType>
Display
#[serde(into = "IntoType")]
IntoType
Clone
Into<IntoType>
#[serde(crate = "...")]
#[serde(alias = "name")]
#[serde(skip)]
#[serde(skip_serializing)]
#[serde(skip_deserializing)]
#[serde(serialize_with = "path")]
path
fn<S>(&FIELD0, &FIELD1, ..., S) -> Result<S::Ok, S::Error> where S: Serializer
#[serde(deserialize_with = "path")]
fn<'de, D>(D) -> Result<FIELDS, D::Error> where D: Deserializer<'de>
#[serde(with = "module")]
#[serde(borrow)]
#[serde(borrow = "'a +'b + ...")]
#[serde(other)]
Default::default()
#[serde(flatten)]
default = "..."
#[serde(skip_serializing_if = "path")]
fn(&T)-> bool
skip_serializing_if="Option::is_none"
fn<S>(&T, S) -> Result<S::Ok, S::Error> where S: Serializer
fn<'de, D>(D) -> Result<T, D::Error> where D: Deserializer<'de>
#[serde(getter = "...")]
Serde 的通过 #[derive(Serialize, Deserialize)] 派生宏为结构体和枚举提供了合理的默认序列化行为,并且可以使用属性在某种程度上进行自定义。
#[derive(Serialize, Deserialize)]
但是对于特殊需求,Serde 可以通过为您的类型手动实现 Serialize 和 Deserialize 特质来完全自定义序列化行为。这两个特质都有只有一个方法,声明如下
pub trait Serialize { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer; } pub trait Deserialize<'de>: Sized { fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>; }
而序列化协议只需要提供 Serializer 和 Deserializer 的实现即可。
创建测试代码 src/ch04_custom_serde.rs
src/ch04_custom_serde.rs
本节参考源码: serde/src/ser/impls.rs
serde/src/ser/impls.rs
特质声明如下
pub trait Serialize { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer; }
该方法的工作是:
&self
self
impl Serialize for i32 { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer, { serializer.serialize_i32(*self) } }
此处仅为示例,Serde 已为所有基础数据类型实现了类似的实现(以上代码已经在 用户 crate 无法编译,因为不满足孤儿规则)
复杂类型序列化一般需要三步:初始化,放置元素,结束。
use serde::ser::{Serialize, Serializer, SerializeSeq, SerializeMap}; impl<T> Serialize for Vec<T> where T: Serialize, { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer, { let mut seq = serializer.serialize_seq(Some(self.len()))?; for e in self { seq.serialize_element(e)?; } seq.end() } } impl<K, V> Serialize for MyMap<K, V> where K: Serialize, V: Serialize, { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer, { let mut map = serializer.serialize_map(Some(self.len()))?; for (k, v) in self { map.serialize_entry(k, v)?; } map.end() } }
(以上代码已经在 用户 crate 编译)
通过阅读源码可知,Rust 为 长度为 032 的数组 和 长度为 016 的元组提供了实现 Serialize 实现
参见源码 serde/src/ser/impls.rs
use serde::{Serialize, Serializer}; use serde::ser::{SerializeStruct, SerializeTupleStruct, SerializeStructVariant, SerializeTupleVariant}; struct Color { r: u8, g: u8, b: u8, } impl Serialize for Color { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer, { let mut state = serializer.serialize_struct("Color", 3)?; state.serialize_field("r", &self.r)?; state.serialize_field("g", &self.g)?; state.serialize_field("b", &self.b)?; state.end() } } struct Point2D(f64, f64); impl Serialize for Point2D { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer, { let mut state = serializer.serialize_tuple_struct("Point2D", 2)?; state.serialize_field(&self.0)?; state.serialize_field(&self.1)?; state.end() } } struct Inches(u64); impl Serialize for Inches { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer, { serializer.serialize_newtype_struct("Inches", &self.0) } } struct Instance; impl Serialize for Instance { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer, { serializer.serialize_unit_struct("Instance") } } #[cfg(test)] mod tests { use super::*; #[test] fn ch04() { println!("Color = {}", serde_json::to_string(&Color{r:1, g:2, b:3}).unwrap()); println!("Point2D = {}", serde_json::to_string(&Point2D(1.0, 2.0)).unwrap()); println!("Inches = {}", serde_json::to_string(&Inches(1)).unwrap()); println!("Instance = {}", serde_json::to_string(&Instance).unwrap()); } }
use serde::{Serialize, Serializer}; use serde::ser::{SerializeStruct, SerializeTupleStruct, SerializeStructVariant, SerializeTupleVariant}; #[allow(unused, dead_code)] enum E { Color { r: u8, g: u8, b: u8 }, Point2D(f64, f64), Inches(u64), Instance, } impl Serialize for E { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer, { match self { E::Color {r,g,b} => { let mut state = serializer.serialize_struct_variant("E", 0, "Color", 3)?; state.serialize_field("r", r)?; state.serialize_field("g", g)?; state.serialize_field("b", b)?; state.end() } E::Point2D(x, y) => { let mut state = serializer.serialize_tuple_variant("E", 1, "Point2D", 2)?; state.serialize_field(x)?; state.serialize_field(y)?; state.end() } E::Inches(i) => serializer.serialize_newtype_variant("E", 2, "Inches", i), E::Instance => serializer.serialize_unit_variant("E", 3, "Instance"), } } } #[cfg(test)] mod tests { use super::*; #[test] fn ch04() { println!("E::Color = {}", serde_json::to_string(&E::Color{r:1, g:2, b:3}).unwrap()); println!("E::Point2D = {}", serde_json::to_string(&E::Point2D(1.0, 2.0)).unwrap()); println!("E::Inches = {}", serde_json::to_string(&E::Inches(1)).unwrap()); println!("E::Instance = {}", serde_json::to_string(&E::Instance).unwrap()); } }
由于 RFC 1210 specialization 尚未稳定。
因此 [u8] 和 Vec<u8> 分别与 [T] 和 Vec<T> 重复产生定义。
Vec<u8>
[T]
因此 在 serde 库中,没有对 serializer.serialize_bytes(self) 的使用
serde
serializer.serialize_bytes(self)
因此 Serde 创建了一个专为 字节数组 实现 Serialize 类型 的 库 serde_bytes,以提高字节流的序列化 / 反序列化效率。
serde_bytes
使用方式如下
#[derive(Serialize)] struct Efficient<'a> { #[serde(with = "serde_bytes")] bytes: &'a [u8], byte_buf: Vec<u8>, } struct Efficient2<'a> { bytes: &'a [u8], byte_buf: Vec<u8>, } impl <'a> Serialize for Efficient2<'a> { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer, { let mut state = serializer.serialize_struct("Efficient2", 2)?; state.serialize_field("bytes", { struct SerializeWith<'__a, 'a: '__a> { values: (&'__a &'a [u8],), phantom: serde::export::PhantomData<Efficient2<'a>>, } impl<'__a, 'a: '__a> serde::Serialize for SerializeWith<'__a, 'a> { fn serialize<__S>( &self, __s: __S, ) -> serde::export::Result<__S::Ok, __S::Error> where __S: serde::Serializer, { serde_bytes::serialize(self.values.0, __s) } } &SerializeWith { values: (&self.bytes,), phantom: serde::export::PhantomData::<Efficient2<'a>>, } })?; state.serialize_field("byte_buf", &self.byte_buf)?; state.end() } }
针对 Option 枚举 和 #[derive(Serialize)] 普通枚举的代码实现逻辑不同:
Option
#[derive(Serialize)]
Some(value)
serializer.serialize_some(value)
None
serializer.serialize_none()
本节参考源码:
serde/src/de/mod.rs
pub trait Deserialize<'de>: Sized { fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>; }
Visitor
use std::fmt; use serde::de::{self, Visitor}; struct I32Visitor; impl<'de> Visitor<'de> for I32Visitor { type Value = i32; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("an integer between -2^31 and 2^31") } fn visit_i8<E>(self, value: i8) -> Result<Self::Value, E> where E: de::Error, { Ok(i32::from(value)) } fn visit_i32<E>(self, value: i32) -> Result<Self::Value, E> where E: de::Error, { Ok(value) } fn visit_i64<E>(self, value: i64) -> Result<Self::Value, E> where E: de::Error, { use std::i32; if value >= i64::from(i32::MIN) && value <= i64::from(i32::MAX) { Ok(value as i32) } else { Err(E::custom(format!("i32 out of range: {}", value))) } } } impl<'de> Deserialize<'de> for i32 { fn deserialize<D>(deserializer: D) -> Result<i32, D::Error> where D: Deserializer<'de>, { deserializer.deserialize_i32(I32Visitor) } }
需要注意的是
Visitor::visit_map
struct MyMap<K, V>(PhantomData<K>, PhantomData<V>); impl<K, V> MyMap<K, V> { fn with_capacity(c: usize) -> Self { println!("build MyMap size = {}", c); MyMap(PhantomData, PhantomData) } fn insert(&mut self, _: K, _: V) { println!("call MyMap insert") } } struct MyMapVisitor<K, V> { marker: PhantomData<fn() -> MyMap<K, V>> } impl<K, V> MyMapVisitor<K, V> { fn new() -> Self { MyMapVisitor { marker: PhantomData } } } impl<'de, K, V> Visitor<'de> for MyMapVisitor<K, V> where K: Deserialize<'de>, V: Deserialize<'de>, { type Value = MyMap<K, V>; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("a very special map") } fn visit_map<M>(self, mut access: M) -> Result<Self::Value, M::Error> where M: MapAccess<'de>, { let mut map = MyMap::with_capacity(access.size_hint().unwrap_or(0)); while let Some((key, value)) = access.next_entry()? { map.insert(key, value); } Ok(map) } } impl<'de, K, V> Deserialize<'de> for MyMap<K, V> where K: Deserialize<'de>, V: Deserialize<'de>, { fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>, { deserializer.deserialize_map(MyMapVisitor::new()) } } #[cfg(test)] mod tests { use super::*; #[test] fn ch04() { let json1 = r#" { "k1": "v1", "k2": "v2" } "#; let _r1: MyMap<String, String> = serde_json::from_str(json1).unwrap(); } }
use std::fmt; use serde::de::{self, Deserialize, Deserializer, Visitor, SeqAccess, MapAccess}; #[derive(Debug)] struct Duration { secs: u64, nanos: u32, } impl Duration { fn new(secs: u64, nanos: u32) -> Duration { Duration { secs, nanos } } } impl<'de> Deserialize<'de> for Duration { fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>, { enum Field { Secs, Nanos }; impl<'de> Deserialize<'de> for Field { fn deserialize<D>(deserializer: D) -> Result<Field, D::Error> where D: Deserializer<'de>, { struct FieldVisitor; impl<'de> Visitor<'de> for FieldVisitor { type Value = Field; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("`secs` or `nanos`") } fn visit_str<E>(self, value: &str) -> Result<Field, E> where E: de::Error, { match value { "secs" => Ok(Field::Secs), "nanos" => Ok(Field::Nanos), _ => Err(de::Error::unknown_field(value, FIELDS)), } } } deserializer.deserialize_identifier(FieldVisitor) } } struct DurationVisitor; impl<'de> Visitor<'de> for DurationVisitor { type Value = Duration; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("struct Duration") } fn visit_seq<V>(self, mut seq: V) -> Result<Duration, V::Error> where V: SeqAccess<'de>, { let secs = seq.next_element()? .ok_or_else(|| de::Error::invalid_length(0, &self))?; let nanos = seq.next_element()? .ok_or_else(|| de::Error::invalid_length(1, &self))?; Ok(Duration::new(secs, nanos)) } fn visit_map<V>(self, mut map: V) -> Result<Duration, V::Error> where V: MapAccess<'de>, { let mut secs = None; let mut nanos = None; while let Some(key) = map.next_key::<Field>()? { match key { Field::Secs => { if secs.is_some() { return Err(de::Error::duplicate_field("secs")); } secs = Some(map.next_value()?); } Field::Nanos => { if nanos.is_some() { return Err(de::Error::duplicate_field("nanos")); } nanos = Some(map.next_value()?); } } } let secs = secs.ok_or_else(|| de::Error::missing_field("secs"))?; let nanos = nanos.ok_or_else(|| de::Error::missing_field("nanos"))?; Ok(Duration::new(secs, nanos)) } } const FIELDS: &'static [&'static str] = &["secs", "nanos"]; deserializer.deserialize_struct("Duration", FIELDS, DurationVisitor) } } #[cfg(test)] mod tests { use super::*; #[test] fn ch04() { let json2 = r#" { "secs": 1, "nanos": 2 } "#; let r2: Duration = serde_json::from_str(json2).unwrap(); println!("Duration = {:?}", r2); } }
参见 https://serde.rs/unit-testing.html
参见:https://serde.rs/data-format.html
参见:https://serde.rs/lifetimes.html
参见:https://serde.rs/no-std.html
参见:https://serde.rs/feature-flags.html https://www.rectcircle.cn/posts/rust-serde/
The text was updated successfully, but these errors were encountered:
No branches or pull requests
参考
创建测试项目
cargo new serde-learn --lib
依赖
Cargo.toml
一、总览
1、简介
Serde 是 Rust 生态中最主流的 序列化、反序列化框架
设计上,基于 Rust 的静态类型系统和元编程(宏)的能力,使 Serde 序列化的执行速度与手写序列化器的速度相同。
使用上及其简单
Serialize
和Deserialize
特质即可 (大多数情况下使用过derive
宏即可)Serializer
和Deserializer
特质的实现即可。Serde 及社区提供主流的序列化协议的支持,具体如下
2、数据结构
Serde 对常见 Rust 标准库数据结构 提供了开箱即用的实现。例如:
String
,&str
,usize
,Vec<T>
,HashMap<K,V>
。对于自定义类型可以通过 派生宏 提供支持
src/ch01_overview.rs
二、Serde 数据模型
Serde 数据模型是 与 Rust 数据结构和数据格式进行交互的 API。您可以将其视为 Serde 的类型系统,Serde 将 Rust 类型分为 29 种
Serialize
:根据 Rust 类型调用参数Serializer
上的方法,而Serializer
的实现由序列化提供商提供Deserialize
:根据 Rust 类型调用参数Serializer
上的方法,传递一个 实现了 Visitor 的类型1、29 种类型
\0
结尾的形式),可能长度为 0[u8]
()
的类型,它表示不包含数据的匿名值struct Unit
或PhantomData<T>
,它表示不包含数据的命名值enum E {A, B}
中的E::A
和E::B
struct Millimeters(u8)
enum E {N(u8) }
中的E::N
Vec<T>
或者HashSet<T>
vec![Value::Bool(true), Value::Char('c')]
之类的同质 Rust 集合可以序列化为异构 Serde seq,在这种情况下,包含 Serde bool 和 Serde char。(u8,)
或(String, u64, Vec<T>)
或[u64; 10]
struct Rgb(u8, u8, u8)
enum E {T(u8, u8) }
中 的E::T
BTreeMap <K, V>
。进行序列化时,在遍历所有条目之前,长度可能未知,也可能未知。反序列化时,通过 查看数据 可以得知长度struct S {r: u8, g: u8, b: u8}
enum E {S { r: u8, g: u8, b: u8} }
中 的E::S
2、映射到数据模型
对于大多数 Rust 类型,将它们映射到 Serde 数据模型中非常简单。例如,Rust bool 类型对应于 Serde 的 bool 类型。Rust 元组结构
Rgb(u8, u8, u8)
对应于 Serde 的元组结构类型。但是不一定就是这种简单一一对应的映射,例如:
std::ffi::OsString
类型,在 Windows 和 Unix 下表现不一致。直觉上应该映射为string
,但是跨平台无法使用。因此更好的方案是:三、派生宏
1、实例
参见:一、总览 2、数据结构
2、属性
属性用于使用派生宏的一些配置,主要分为 3 类:
容器属性 Container attributes — 应用在 枚举 和 结构体
Variant 属性 Variant attributes — 应用在 枚举的 Variant 上
字段属性 Field attributes — 应用在 结构体 和 枚举 variant 的 字段上
(1)容器属性
#[serde(rename = "name")]
#[serde(rename(serialize = "ser_name"))]
#[serde(rename(deserialize = "de_name"))]
#[serde(rename(serialize = "ser_name", deserialize = "de_name"))]
#[serde(rename_all = "...")]
"..."
的可选值为"lowercase"
,"UPPERCASE"
,"PascalCase"
,"camelCase"
,"snake_case"
,"SCREAMING_SNAKE_CASE"
,"kebab-case"
,"SCREAMING-KEBAB-CASE"
#[serde(rename_all(serialize = "..."))]
#[serde(rename_all(deserialize = "..."))]
#[serde(rename_all(serialize = "...", deserialize = "..."))]
#[serde(deny_unknown_fields)]
#[serde(tag = "type")]
#[serde(tag = "t", content = "c")]
#[serde(untagged)]
#[serde(bound = "T: MyTrait")]
#[serde(bound(serialize = "T: MySerTrait"))]
#[serde(bound(deserialize = "T: MyDeTrait"))]
#[serde(bound(serialize = "T: MySerTrait", deserialize = "T: MyDeTrait"))]
#[serde(default)]
#[serde(default = "path")]
fn()->T
。default="my_default"
将调用my_default()
,而default = "SomeTrait::some_default"
将调用SomeTrait::some_default()
#[serde(remote = "...")]
#[serde(transparent)]
只允许应用在只有一个字段枚举或者结构体上
表示只序列化内部对象,不要外部支撑,比如
#[serde(from = "FromType")]
FromType
后,转换为 该类型From<FromType>
FromType
必须实现Deserialize
#[serde(try_from = "FromType")]
FromType
后,转换为 该类型TryFrom<FromType>
,其中错误类型必须实现Display
FromType
必须实现Deserialize
#[serde(into = "IntoType")]
IntoType
类型,然后再序列化Clone
和Into<IntoType>
IntoType
必须实现Serialize
#[serde(crate = "...")]
(2)Variant 属性
#[serde(rename = "name")]
#[serde(rename(serialize = "ser_name"))]
#[serde(rename(deserialize = "de_name"))]
#[serde(rename(serialize = "ser_name", deserialize = "de_name"))]
#[serde(alias = "name")]
#[serde(rename_all = "...")]
"..."
的可选值为"lowercase"
,"UPPERCASE"
,"PascalCase"
,"camelCase"
,"snake_case"
,"SCREAMING_SNAKE_CASE"
,"kebab-case"
,"SCREAMING-KEBAB-CASE"
#[serde(rename_all(serialize = "..."))]
#[serde(rename_all(deserialize = "..."))]
#[serde(rename_all(serialize = "...", deserialize = "..."))]
#[serde(skip)]
#[serde(skip_serializing)]
#[serde(skip_deserializing)]
#[serde(serialize_with = "path")]
path
函数 进行序列化,该序列化函数声明为:fn<S>(&FIELD0, &FIELD1, ..., S) -> Result<S::Ok, S::Error> where S: Serializer
#[serde(deserialize_with = "path")]
path
函数 进行反序列化,该序列化函数声明为:fn<'de, D>(D) -> Result<FIELDS, D::Error> where D: Deserializer<'de>
#[serde(with = "module")]
#[serde(serialize_with = "path")]
和#[serde(deserialize_with = "path")]
path 所在 module#[serde(bound = "T: MyTrait")]
#[serde(bound(serialize = "T: MySerTrait"))]
#[serde(bound(deserialize = "T: MyDeTrait"))]
#[serde(bound(serialize = "T: MySerTrait", deserialize = "T: MyDeTrait"))]
#[serde(borrow)]
和#[serde(borrow = "'a +'b + ...")]
#[serde(other)]
(3)字段属性
#[serde(rename = "name")]
#[serde(rename(serialize = "ser_name"))]
#[serde(rename(deserialize = "de_name"))]
#[serde(rename(serialize = "ser_name", deserialize = "de_name"))]
#[serde(alias = "name")]
#[serde(default)]
Default::default()
#[serde(default = "path")]
fn()->T
。default="my_default"
将调用my_default()
,而default = "SomeTrait::some_default"
将调用SomeTrait::some_default()
#[serde(flatten)]
#[serde(skip)]
Default::default()
或default = "..."
生成该值#[serde(skip_serializing)]
#[serde(skip_serializing)]
Default::default()
或default = "..."
生成该值#[serde(skip_serializing_if = "path")]
fn(&T)-> bool
。例如skip_serializing_if="Option::is_none"
#[serde(serialize_with = "path")]
path
函数 进行序列化,函数声明为:fn<S>(&T, S) -> Result<S::Ok, S::Error> where S: Serializer
Serialize
#[serde(deserialize_with = "path")]
path
函数 进行反序列化,该序列化函数声明为:fn<'de, D>(D) -> Result<T, D::Error> where D: Deserializer<'de>
Serialize
#[serde(with = "module")]
#[serde(serialize_with = "path")]
和#[serde(deserialize_with = "path")]
path 所在 module#[serde(borrow)]
和#[serde(borrow = "'a +'b + ...")]
#[serde(bound = "T: MyTrait")]
#[serde(bound(serialize = "T: MySerTrait"))]
#[serde(bound(deserialize = "T: MyDeTrait"))]
#[serde(bound(serialize = "T: MySerTrait", deserialize = "T: MyDeTrait"))]
#[serde(getter = "...")]
四、自定义序列化 / 反序列化
Serde 的通过
#[derive(Serialize, Deserialize)]
派生宏为结构体和枚举提供了合理的默认序列化行为,并且可以使用属性在某种程度上进行自定义。但是对于特殊需求,Serde 可以通过为您的类型手动实现
Serialize
和Deserialize
特质来完全自定义序列化行为。这两个特质都有只有一个方法,声明如下而序列化协议只需要提供
Serializer
和Deserializer
的实现即可。创建测试代码
src/ch04_custom_serde.rs
1、实现 Serialize
本节参考源码:
serde/src/ser/impls.rs
特质声明如下
该方法的工作是:
Serializer
参数上的一种方法并传递&self
,将self
映射到 Serde 数据模型中(1)序列化基础数据类型
此处仅为示例,Serde 已为所有基础数据类型实现了类似的实现(以上代码已经在 用户 crate 无法编译,因为不满足孤儿规则)
(2)序列化序列或者 map
复杂类型序列化一般需要三步:初始化,放置元素,结束。
(以上代码已经在 用户 crate 编译)
(3)序列化元组
通过阅读源码可知,Rust 为 长度为 0
32 的数组 和 长度为 016 的元组提供了实现 Serialize 实现参见源码
serde/src/ser/impls.rs
(4)序列化结构体
(5)序列化枚举
(6)序列化字节数组
由于 RFC 1210 specialization 尚未稳定。
因此
[u8]
和Vec<u8>
分别与[T]
和Vec<T>
重复产生定义。因此 在
serde
库中,没有对serializer.serialize_bytes(self)
的使用因此 Serde 创建了一个专为 字节数组 实现
Serialize
类型 的 库serde_bytes
,以提高字节流的序列化 / 反序列化效率。使用方式如下
Cargo.toml
src/ch04_custom_serde.rs
(7)序列化 Option
针对
Option
枚举 和#[derive(Serialize)]
普通枚举的代码实现逻辑不同:Some(value)
使用serializer.serialize_some(value)
进行序列化,在 JSON 中将返回 value 的序列化None
使用serializer.serialize_none()
进行序列化,在 JSON 中将返回 null2、实现 Deserialize
本节参考源码:
serde/src/de/mod.rs
特质声明如下
该方法的工作是:
Deserializer
参数上的一种方法,并传递一个实现了Visitor
的实例(1)反序列化基础数据类型
此处仅为示例,Serde 已为所有基础数据类型实现了类似的实现(以上代码已经在 用户 crate 无法编译,因为不满足孤儿规则)
需要注意的是
Visitor::visit_map
,因此在输入包含 map 时尝试反序列化 i32 是类型错误。(2)反序列化 Map
(3)反序列化结构
3、单元测试
参见 https://serde.rs/unit-testing.html
五、实现序列化器 / 反序列化器(Serializer/Deserializer)
参见:https://serde.rs/data-format.html
六、反序列化器生命周期
参见:https://serde.rs/lifetimes.html
七、no-std 支持
参见:https://serde.rs/no-std.html
八、feature 列表
参见:https://serde.rs/feature-flags.html
https://www.rectcircle.cn/posts/rust-serde/
The text was updated successfully, but these errors were encountered: