У меня есть HashMap
в качестве значения в структуре, которую я сериализирую вручную:
pub struct GitInfo {
pub branches: HashMap<Oid, Branch>,
}
Branch
- это то, что я определил, но Oid
это внешний тип, которым я не владею, с to_string()
методом, который я бы с удовольствием использовал ...
Я прочитал Как мне использовать Serde для сериализации HashMap свыглядит как ключи к JSON? , но это относится к ключам, определенным автором - я не могу реализовать Serialize
для Oid
, поскольку его нет в моем ящике. И я не могу реализовать Serialize
для HashMap<Oid, Branch>
по аналогичным причинам.
Есть ли способ обойти это? Я мог бы построить структуру оболочки вокруг HashMap<Oid, Branch>
, но это выглядит как перебор.
Было предложено посмотреть на Как преобразовать поля во время сериализации с использованием Serde? или Как можноЯ реализую Serialize, используя существующую реализацию свойства Display? - оба, кажется, сводятся к использованию serialize_with
- что я мог бы сделать, но мне пришлось бы использовать макрос derive(Serialize)
, когда я планировал сериализоватьGitInfo
вручную (см. Ниже). Или я мог бы использовать объект-оболочку.
Если это единственные варианты, я мог бы с этим смириться, но кажется немного удивительным, что не существует более простого способа - есть ли какой-то способ вызова функциикак используется макрос serialize_with
, но изнутри моей GitInfo
сериализации?
Что-то вроде:
impl Serialize for GitInfo {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut state = serializer.serialize_struct("GitInfo", 2)?;
state.serialize_field("other bits", &self.other_bits)?;
state.serialize_field("branches", /* something */)?;
state.end()
}
}