У меня есть 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()
}
}
serialize_field
вместоserialize_map
? - person Shepmaster   schedule 09.10.2019GitInfo
с полемHashMap
. Итак, я используюserialize_struct
, который возвращаетSerializeStruct
, у которого нет методаserialize_map
. Если есть способ вызватьserialize_map
, чтобы создать новую сериализованную версию карты, а затем вставить результаты в качестве параметра вserialize_field
, это было бы здорово, но я еще не нашел способа сделать это. - person Korny   schedule 09.10.2019