MST
星途 面试题库

面试题:Rust中serde序列化与反序列化的自定义处理

有一个Rust结构体`Point`,包含`x`和`y`两个`f64`类型字段。现在要求在序列化时,将`x`和`y`的值都乘以2后再进行序列化;在反序列化时,将接收到的值除以2后赋给结构体字段。请利用`serde`库的相关特性实现这个需求,并解释涉及到的`serde`的关键概念和宏的使用。
19.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 实现代码
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)
}
  1. serde关键概念和宏的使用解释
    • SerializeDeserialize
      • #[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::deserializedeserializer中反序列化出一个f64值,然后将该值除以2并返回。