MST

星途 面试题库

面试题:Rust 字符串序列化与反序列化中的自定义序列化器与反序列化器

给定一个 Rust 结构体 `Complex { real: f64, imaginary: f64 }`,要求将其实例序列化为自定义格式的字符串(例如 `"real+imaginary i"` 的形式),并能从这种自定义格式字符串反序列化回 `Complex` 实例。请通过实现自定义的序列化器和反序列化器来完成此任务。
19.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::fmt::{self, Display, Error, Formatter};
use std::str::FromStr;

// 定义结构体
struct Complex {
    real: f64,
    imaginary: f64,
}

// 实现序列化,将Complex实例转换为 "real+imaginary i" 格式的字符串
impl Display for Complex {
    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
        write!(f, "{:.2}+{:.2} i", self.real, self.imaginary)
    }
}

// 实现反序列化,从 "real+imaginary i" 格式的字符串转换回Complex实例
impl FromStr for Complex {
    type Err = Error;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        let parts: Vec<&str> = s.split('+').collect();
        if parts.len() != 2 {
            return Err(Error);
        }
        let real = parts[0].parse::<f64>()?;
        let imaginary_str = parts[1].trim_end_matches(" i");
        let imaginary = imaginary_str.parse::<f64>()?;
        Ok(Complex { real, imaginary })
    }
}

你可以使用以下方式测试:

fn main() {
    let num = Complex { real: 3.14, imaginary: 2.71 };
    let serialized = num.to_string();
    println!("Serialized: {}", serialized);

    let deserialized: Result<Complex, _> = serialized.parse();
    if let Ok(deserialized_num) = deserialized {
        println!("Deserialized: real = {}, imaginary = {}", deserialized_num.real, deserialized_num.imaginary);
    } else {
        println!("Deserialization failed");
    }
}