Этот вопрос похож на Как мне реализовать черту, которой я не владею, для типа, которым я не владею?
Я написал сериализатор для 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.