I have a HashMap as a value in a struct that I'm manually serializing:
pub struct GitInfo {
    pub branches: HashMap<Oid, Branch>,
}
Branch is something I've defined, but Oid is an external type I don't own, with a to_string() method I'd be happy to use...
I've read How do I use Serde to serialize a HashMap with structs as keys to JSON? but it refers to keys the author defined - I can't implement Serialize for Oid as it's not in my crate.  And I can't implement Serialize for HashMap<Oid, Branch> for similar reasons.
Is there some way around this?  I could build a wrapper struct around HashMap<Oid, Branch> but that seems like overkill.
It was suggested that I look at How to transform fields during serialization using Serde? or How can I implement Serialize using an existing Display trait implementation? - both seem to boil down to using serialize_with - which I could possibly do, but I'd have to use the derive(Serialize) macro, when I was planning to serialize GitInfo manually (see below).  Or I could use a wrapper object.
If those are the only options, I could live with it, but it seems a bit surprising that there isn't a simpler way - is there some way to call a function like the serialize_with macro uses, but from within my GitInfo serialization?
Something like:
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()
    }
}