- 定义
MySpecialType
结构体:
use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Serialize, Deserialize)]
struct MySpecialType {
data: Vec<u8>,
}
- 实现
Serialize
特质:
impl Serialize for MySpecialType {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let hex_string = hex::encode(self.data.as_slice());
serializer.serialize_str(&hex_string)
}
}
- 实现
Deserialize
特质:
impl<'de> Deserialize<'de> for MySpecialType {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let hex_string = String::deserialize(deserializer)?;
let data = hex::decode(hex_string).map_err(serde::de::Error::custom)?;
Ok(MySpecialType { data })
}
}
- 性能优化和内存使用:
- 内存使用:
- 在序列化时,
hex::encode
方法会生成一个新的字符串,但由于它是基于字节切片直接转换,不会额外保留中间的大尺寸数据结构。在反序列化时,hex::decode
直接从字符串转换为字节向量,避免了不必要的中间数据拷贝。
- 整个过程中,主要的内存占用就是
Vec<u8>
本身和转换过程中的临时字符串,通过合理的设计避免了额外的大内存占用。
- 性能:
hex
库在编码和解码操作上进行了优化,对于大尺寸数据有较好的性能表现。
- 在序列化时,由于
Vec<u8>
是连续内存布局,直接切片处理能充分利用CPU缓存,提高编码速度。反序列化时同理,直接从字符串转换为 Vec<u8>
也能减少不必要的内存操作。
- 错误处理:
- 在
Deserialize
实现中,hex::decode
可能会因为无效的十六进制字符串而失败,通过 map_err
将其转换为 serde::de::Error
,这样能与 serde
的错误处理机制无缝衔接,使反序列化过程更加健壮。如果输入的JSON格式不符合预期(例如不是字符串),serde
自身的错误处理机制会捕获并返回相应的错误。