面试题答案
一键面试设计思路
- 自定义序列化格式设计:
- 定义一种简单的文本格式,例如使用特定分隔符分隔不同字段,每行表示一个对象。
- 对于复合类型,如结构体,可以按字段顺序依次序列化。
- 对于基本类型(如整数、字符串等),采用直接文本表示,例如整数直接写数字,字符串用引号包裹。
- 与serde库整合:
- 利用serde的
Serialize
和Deserialize
trait。 - 为自定义格式实现这两个trait,使得serde能够识别并使用我们的序列化和反序列化逻辑。
- 利用serde的
关键实现步骤
- 定义自定义格式的序列化函数:
- 实现将自定义数据类型转换为自定义格式文本的逻辑。
- 对于结构体,遍历其字段并按格式要求写入。
- 定义自定义格式的反序列化函数:
- 解析自定义格式文本,将其转换回自定义数据类型。
- 根据格式规则,分割文本并解析每个字段。
- 实现serde的
Serialize
和Deserialize
trait:- 在
Serialize
trait实现中调用自定义的序列化函数。 - 在
Deserialize
trait实现中调用自定义的反序列化函数。
- 在
核心代码
use serde::{Serialize, Deserialize};
// 自定义数据类型
#[derive(Serialize, Deserialize)]
struct MyStruct {
field1: i32,
field2: String,
}
// 自定义序列化格式的序列化函数
fn custom_serialize<T: Serialize>(data: &T) -> Result<String, serde::ser::Error> {
let mut output = String::new();
let mut serializer = serde::Serializer::serialize_struct(&mut output, "MyStruct", 2)?;
serializer.serialize_field("field1", &data.field1)?;
serializer.serialize_field("field2", &data.field2)?;
serializer.end()?;
Ok(output)
}
// 自定义序列化格式的反序列化函数
fn custom_deserialize<'de, T: Deserialize<'de>>(input: &'de str) -> Result<T, serde::de::Error> {
let mut deserializer = serde::Deserializer::from_str(input);
let mut struct_deserializer = deserializer.deserialize_struct("MyStruct", &["field1", "field2"])?;
let field1 = struct_deserializer.field::<i32>("field1")?;
let field2 = struct_deserializer.field::<String>("field2")?;
struct_deserializer.end()?;
Ok(MyStruct { field1, field2 })
}
// 实现serde的Serialize trait
impl Serialize for MyStruct {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
custom_serialize(self).map_err(|e| e.into())
}
}
// 实现serde的Deserialize trait
impl<'de> Deserialize<'de> for MyStruct {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let input = String::deserialize(deserializer)?;
custom_deserialize(&input).map_err(|e| e.into())
}
}
上述代码实现了一个简单的自定义序列化格式,并与serde库进行了整合。实际应用中,自定义格式的序列化和反序列化函数可根据更复杂的需求进行完善。