- 实现代码:
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
struct Point {
#[serde(serialize_with = "serialize_double", deserialize_with = "deserialize_half")]
x: f64,
#[serde(serialize_with = "serialize_double", deserialize_with = "deserialize_half")]
y: f64,
}
fn serialize_double<S>(value: &f64, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_f64(value * 2.0)
}
fn deserialize_half<'de, D>(deserializer: D) -> Result<f64, D::Error>
where
D: serde::Deserializer<'de>,
{
let value = f64::deserialize(deserializer)?;
Ok(value / 2.0)
}
serde
关键概念和宏的使用解释:
Serialize
和Deserialize
宏:
#[derive(Serialize, Deserialize)]
是serde
提供的派生宏。当在结构体上使用这两个宏时,serde
会自动为该结构体生成序列化和反序列化的代码。这大大减少了手动编写序列化和反序列化逻辑的工作量。
serde
属性:
#[serde(serialize_with = "serialize_double", deserialize_with = "deserialize_half")]
:这是serde
提供的属性,用于自定义字段的序列化和反序列化行为。
serialize_with
指定在序列化该字段时使用serialize_double
函数。这个函数接收字段值并将其乘以2后进行序列化。
deserialize_with
指定在反序列化该字段时使用deserialize_half
函数。这个函数接收反序列化得到的值并将其除以2后返回。
- 序列化和反序列化函数:
serialize_double
函数:它接收一个f64
类型的值和一个Serializer
实例。它将传入的值乘以2,然后通过serializer.serialize_f64
将结果序列化为合适的格式(如JSON中的数字)。
deserialize_half
函数:它接收一个Deserializer
实例,首先使用f64::deserialize
从deserializer
中反序列化出一个f64
值,然后将该值除以2并返回。