【发布时间】:2020-12-13 19:18:42
【问题描述】:
这个问题类似 How do I implement a trait I don't own for a type I don't own?
我使用文档中描述的机制为 Date 编写了一个序列化程序,我的模块包装了一个序列化函数
pub mod my_date_format {
use chrono::{Date, NaiveDate, Utc};
use serde::{self, Deserialize, Deserializer, Serializer};
const SERIALIZE_FORMAT: &'static str = "%Y-%m-%d";
pub fn serialize<S>(date: &Date<Utc>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let s = format!("{}", date.format(SERIALIZE_FORMAT));
serializer.serialize_str(&s)
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Date<Utc>, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
NaiveDate::parse_from_str(s.as_str(), SERIALIZE_FORMAT)
.map_err(serde::de::Error::custom)
.map(|x| {
let now = Utc::now();
let date: Date<Utc> = Date::from_utc(x, now.offset().clone());
date
})
}
}
那我可以做:
struct MyStruct {
#[serde(with = "my_date_format")]
pub start: Date<Utc>,
}
问题是如果我将序列化的东西包装成其他类型(它们本身是可序列化的)我会得到错误:
#[serde(with = "my_date_format")]
pub dates: Vec<Date<Utc> // this won't work now since my function doesn't serialize vectors
pub maybe_date: Option<Date<Utc>>> // won't work
pub box_date: Box<Date<Utc>> // won't work...
如何在使用我自己的序列化程序时获得提供的实现?
https://docs.serde.rs/serde/ser/index.html#implementations-of-serialize-provided-by-serde
【问题讨论】: