Как использовать serde для сериализации HashMap с несериализуемыми ключами? - PullRequest
0 голосов
/ 09 октября 2019

У меня есть 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()
    }
}
...