Serde
Overview
serde是为rust数据结构高效的序列化和反序列化的框架,其他的大部分语言使用运行时的反射技术来序列化数据,Serde是建立在Rust高效的trait生态系统,一个实现trait Serialize和trait Deserialize的数据结构知道如何序列化和反序列化它自己(或者使用serde的derive属性在编译时自动生成实现),这避免了任何反射的开销和任何运行时类型推断的信息,实际上,在大多数场景下数据结构和数据格式的交互能够完全的被Rust编译器优化.Serde支持多种格式的序列化,甚至能够自行增加格式(这也是被称为框架的原因)Attributes
Atrributes用于定制化通过Serde的derive产生的Serialize和Deserialize实现,存在三种attributes的策略:Container Attributes
应用于struct和enum声明Variant Attributes
应用于enum变体Field Attributes
应用于struct或enum变体的字段Container attributes
#[serde(rename = "name")]
序列化或反序列化通过给定的名字而不是在Rust中的名称.允许为序列化和反序列化指定独立的名称#[serde(rename(serialize = "ser_name"))]
#[serde(rename(deserialize = "deser_name"))]
#[serde(rename(serialize = "ser_name", deserailize = "deser_name"))]
#[serde(rename_all = "...")]
重命名所有的字段(如果是结构体)或变体(如果是枚举体),通过给定的情况转换,可能的情况有 "lowercase","UPPERCASE","PascalCase","camelCase","snake_case","SCREAM_SNAKE_CASE", "kebab-case", "SCREAM-KABAB-CASE" 允许为序列化和反序列化指定不同的情况.#[serde(rename_all(serialize = "..."))]
#[serde(rename_all(deserialize = "..."))]
#[serde(rename_all(serialize = "...", deserialize = "..."))]
#[serde(deny_unknown_fields)]
在反序列化时遭遇到未知字段时总是反映错误,当这个属性不存在时,对于自描述的格式JSON默认未知的字段将被忽略.#[serde(tag = "type")]
使用内部被标记的enum表示这个enum#[serde(tag = "t", content = "c")]
使用相邻的被标记的enum表示这个enum,为tag和content通过给定的字段名称.#[serde(untagged)]
使用未标记的enum表示这个enum#[serde(bound = "T: MyTrait")]
Where-caluse对于Serialize和Deserialize实现,这将替换所有Serde推断的任何trait 限定,允许为序列化和反序列化指定独立的限定.#[serde(bound(serialize = "MySeTrait: T"))]
#[serde(bound(deserialize = "MyDeTrait: T"))]
#[serde(bound(serialize = "MySeTrait: T", deserialize = "MyDeTrait: T"))]
#[serde(default)]
当反序列化,任何错过的字段将被结构体的Default实现填充,只允许用在结构体.#[serde(default = "path")]
当反序列化时,任何错过的字段被给定函数或方法返回的对象填充,函数必须是可调用的 fn() -> T ,比如 default = "my_default" 将会触发 my_default() , default = "SomeTrait::some_default" 将会触发 SomeTrait::some_default() ,这个只能用在结构体.#[serde(remote = "...")]
这个被用于Serialize和Deserialize的派生.#[serde(transparent)]
序列化和反序列化一个有一个字段的newtype struct或braced struct明确的和序列化和反序列化本身相同,和#[repr(transparent)].#[serde(from = "FromType")]
反序列化这个类型通过反序列化到 FromType ,然后转换,这个类型必须实现From#[serde(try_from = "FromType"]
反序列化这个类型通过反序列化到FromType,然后转换,这个类型必须实现TryFrom#[serde(into = "IntoType")]
序列化这个类型通过将其转换为指定的IntoType然后序列化它,这个类型必须实现Clone和Into#[serde(crate = "...")]
指定一个路径到 serde 包实例使用当引用Serde API产生代码,这个通常只用于当触发重新导入Serde从不同包公有的macros的派生.Variant Attributes
#[serde(rename = "name")]
序列化或反序列化这个variant使用给定的name而不是Rust中的name. 允许为序列化或反序列化指定独立的名字#[serde(rename(serialize = "ser_name"))]
#[serde(rename(deserialize = "de_name"))]
#[serde(rename(serialize = "ser_name", deserialize = "de_name"))]
#[serde(alias = "name")]
反序列化通过给定的name或Rust中的name.可能被重复在同一个变体指定多个name.#[serde(rename_all = "...")]
重命名这个结构体的所有variant通过给定的情况case转换,case可以为以下值: "lowercase","UPPERCASE", "snake_case", "PascalCase", "camelCase", "SCREAM_SNAKE_CASE", "kebab-case", "STREAM-KEBAB-CASE" . 可以独立的为序列化和反序列化指定名字#[serde(rename_all(serialize = "..."))]
#[serde(rename_all(deserialize = "..."))]
#[serde(rename_all(serialize = "...", deserialize = "..."))]
#[serde(skip)]
序列化和反序列化跳过该variant#[serde(serializing_skip)]
不会序列化该variant,试图序列化该variant会被认为是错误.#[serde(deserializing_skip)]
不会反序列化该variant,试图反序列化该variant会被认为是错误.#[serde(serialize_with = "path")]
序列化variant使用不同于Serialize实现的函数,给定的函数必须像 fn<S>(&FIELD0, &FIELD1, ..., S) -> Result<S::Ok, S::Error> where S: Serializer
,尽管可能生成超过FIELD{n}类型,Variants使用serialize_with而不要求能够derive Serialize.Field{n}存在variant的每个字段,因此单元variant只有参数
S
,turple/struct有每个字段的参数.
#[serde(deserialize_with = "path")]
反序列化该variant使用特定函数而不是Deserialize的实现,给定的函数必须是形如 fn<'de, D>(D) -> Result<FIELDS, D::Error> where D: Deserializer<'de>
,尽管通用的超过FIELDS的元素,Variant使用deserialize_with,不被要求derive Deserialize.FIELDS是variant所有字段的turple.
#[serde(with = "module")]
serialize_with和deserialize_with的结合,Serde将会使用$module::serialize作为serialize_with,使用$module::deserialize作为deserialize_with函数.#[serde(bound = "MyTrait::T")]
Where-caluse对于Serialize和/或Deserialize实现,这个替代Serde对于当前variant推断的限定,可以独立的指定序列化和反序列化的限定:#[serde(bound(serialize = "MySeTrait::T"))]
#[serde(bound(deserialize = "MyDeTrait::T"))]
#[serde(bound(serialize = "MySeTrait::T", deserialize = "MyDeTrait::T"))]
#[serde(borrow)]和#[serde(borrow = "'a + 'b + ...")]
通过零复制的反序列化由反序列化器借用字段的数据,只被允许在newtype variant.(只有一个字段的turple variant).#[serde(other)]
反序列化这个variant,如果该enum tag不同于其他变体内容在该enum中,只允许内部标记的单元variant或者连续的被标记的enum.比如,如果我们有内部被标记的enum,通过#[serde(tag = "variant")],包含variants A,B和Unknown,由serde(other)标记,Unknown字段将会被反序列化任何时候,无论输入的"variant"字段是A还是B.Field Attributes
#[serde(rename = "name")]
序列化和反序列使用给定的名字而不是Rust的name,允许为序列化和反序列化指定独立的name
#[serde(rename(serialize = "se_name"))]
#[serde(rename(deserialize = "de_name"))]
#[serde(rename(serialize = "se_name", deserialize = "de_name"))]
#[serde(alias = "name")]
反序列化该字段通过给定的名字或Rust的name,为相同的字段指定多个可能的name,可能会被重复.#[serde(default)]
如果该值在反序列时不存在,使用Default::default();#[serde(default = "path")]
如果反序列化时该值不存在,调用函数得到默认值,给定的函数必须形如: fn() -> T ,比如