¿Cómo serializar y deserializar un chrono::Duration?
En mi proyecto actual estoy intentando almacenar una chrono::Duration
en una estructura de configuración, que se serializará y deserializará ocasionalmente usando serde_json
.
Desafortunadamente, parece que Serialize
y Deserialize
no se implementan para chrono::Duration
. Dicho esto, chrono
dice que tiene soporte para serde
a través de una de sus características opcionales. Intenté usar este método, pero ahora el compilador se queja sobre los métodos de retorno:
error [E0308]: tipos no coincidentes
--> src/config.rs:6:10
|
6 | #[derive(Serialize, Deserialize, Debug, Clone)]
| ^^^^^^^^^ se esperaba la estructura `DateTime`, se encontró la estructura `chrono::Duration`
|
= nota: se esperaba la referencia `&DateTime<Utc>`
se encontró la referencia `&'__a chrono::Duration`
= nota: este error se origina en el macro derivado `Serialize` (en compilaciones nocturnas, ejecute con -Z macro-backtrace para obtener más información)
error [E0308]: tipos no coincidentes
--> src/config.rs:6:21
|
6 | #[derive(Serialize, Deserialize, Debug, Clone)]
| ^^^^^^^^^^^ se esperaba la estructura `chrono::Duration`, se encontró la estructura `DateTime`
|
= nota: se esperaba la estructura `chrono::Duration`
se encontró la estructura `DateTime<Utc>`
= nota: este error se origina en el macro `try` (en compilaciones nocturnas, ejecute con -Z macro-backtrace para obtener más información)
¿Por qué está sucediendo esto? ¿Qué puedo hacer para solucionarlo?
Aquí está el código en cuestión:
use serde::{Serialize, Deserialize};
use chrono::{DateTime, Duration, Utc};
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Config {
pub dest_ip: String,
#[serde(borrow)]
pub include_paths: Vec<&'static std::path::Path>,
pub exclude_paths: Vec<&'static std::path::Path>,
#[serde(with = "chrono::serde::ts_seconds")]
pub time_between_checks: Duration,
}
Además, aquí están los bits relevantes de Cargo.toml:
serde_json = "1.0.72"
serde = { version = "1.0.130", features = ["derive"] }
chrono = { version = "0.4.19", features = ["serde"]}
davy.ai
El error está ocurriendo porque
serde_json
espera el tipoDateTime
para la serialización y deserialización, pero estás usando un tipochrono::Duration
. Esto se debe a que estás usandochrono::serde::ts_seconds
para serializar y deserializar laDuration
, que en realidad serializa y deserializa un tipoDateTime
basado en segundos desde la época de Unix.Para solucionar esto, debes usar
chrono::serde::DurationSeconds
en lugar dechrono::serde::ts_seconds
, que serializará y deserializará el tipoDuration
directamente. Aquí está el código actualizado:Ahora,
time_between_checks
se serializará y deserializará como un tipochrono::Duration
directamente, y los errores del compilador deberían resolverse.