diff --git a/pageserver/src/tenant/metadata.rs b/pageserver/src/tenant/metadata.rs index a27602c335..36020ac236 100644 --- a/pageserver/src/tenant/metadata.rs +++ b/pageserver/src/tenant/metadata.rs @@ -12,7 +12,7 @@ use std::fs::{File, OpenOptions}; use std::io::{self, Write}; use anyhow::{bail, ensure, Context}; -use serde::{Deserialize, Serialize}; +use serde::{de::Error, Deserialize, Serialize, Serializer}; use thiserror::Error; use tracing::info_span; use utils::bin_ser::SerializeError; @@ -232,6 +232,28 @@ impl TimelineMetadata { } } +impl<'de> Deserialize<'de> for TimelineMetadata { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let bytes = Vec::::deserialize(deserializer)?; + Self::from_bytes(bytes.as_slice()).map_err(|e| D::Error::custom(format!("{}", e))) + } +} + +impl Serialize for TimelineMetadata { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + let bytes = self + .to_bytes() + .map_err(|e| serde::ser::Error::custom(format!("{}", e)))?; + bytes.serialize(serializer) + } +} + /// Save timeline metadata to file pub fn save_metadata( conf: &'static PageServerConf,