Как использовать serde для сериализации HashMap с несериализуемыми ключами?

У меня есть 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? или Как реализовать сериализацию используя существующую реализацию признака 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()
    }
}

person Korny    schedule 09.10.2019    source источник
comment
Почему вы используете serialize_field вместо serialize_map?   -  person Shepmaster    schedule 09.10.2019
comment
Я сериализую структуру GitInfo с полем HashMap. Итак, я использую serialize_struct, который возвращает SerializeStruct, у которого нет метода serialize_map. Если есть способ вызвать serialize_map, чтобы создать новую сериализованную версию карты, а затем вставить результаты в качестве параметра в serialize_field, это было бы здорово, но я еще не нашел способа сделать это.   -  person Korny    schedule 09.10.2019