MST

星途 面试题库

面试题:Rust serde库自定义序列化与反序列化行为

在Rust中,有一个结构体`struct CustomType { data: Vec<u8>; }`,它的数据`data`存储的是一种自定义二进制格式数据。现在要求使用`serde`库实现将`CustomType`结构体序列化为Base64编码的字符串,并且能够从Base64编码字符串反序列化为`CustomType`结构体实例。请详细说明实现思路,并给出关键代码实现,包括如何实现`Serialize`和`Deserialize` trait。
27.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 实现思路
    • 引入serdebase64相关依赖。serde用于序列化和反序列化,base64用于处理Base64编码。
    • CustomType结构体实现Serialize trait,在实现中先将Vec<u8>数据编码为Base64字符串,再进行序列化。
    • CustomType结构体实现Deserialize trait,在实现中先反序列化Base64字符串,再解码为Vec<u8>数据。
  2. 关键代码实现
    • 引入依赖: 在Cargo.toml中添加:
[dependencies]
serde = { version = "1.0", features = ["derive"] }
base64 = "0.21"
serde_json = "1.0"
  • 实现SerializeDeserialize
use serde::{Serialize, Deserialize};
use base64::Engine as _;

struct CustomType {
    data: Vec<u8>,
}

impl Serialize for CustomType {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        let base64_data = base64::engine::general_purpose::STANDARD.encode(&self.data);
        serializer.serialize_str(&base64_data)
    }
}

impl<'de> Deserialize<'de> for CustomType {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        let base64_data = String::deserialize(deserializer)?;
        let data = base64::engine::general_purpose::STANDARD.decode(base64_data).map_err(serde::de::Error::custom)?;
        Ok(CustomType { data })
    }
}
  • 测试代码
use serde_json;

fn main() {
    let custom_type = CustomType { data: vec![1, 2, 3] };
    let serialized = serde_json::to_string(&custom_type).expect("Serialization failed");
    println!("Serialized: {}", serialized);

    let deserialized: CustomType = serde_json::from_str(&serialized).expect("Deserialization failed");
    println!("Deserialized data: {:?}", deserialized.data);
}