我有一个HashMap
作为一个结构体的值,我正在手动序列化:
pub struct GitInfo {
pub branches: HashMap<Oid, Branch>,
}
Branch
是我定义的内容,但Oid
是一个外部类型,我没有所有权,它有一个to_string()
方法,我很乐意使用它...
我已经阅读了如何使用Serde将带有结构体作为键的HashMap序列化为JSON?,但它引用了作者定义的键 - 我无法为Oid
实现Serialize
,因为它不在我的crate中。同样的原因,我也无法为HashMap<Oid,Branch>
实现Serialize
。
有什么解决办法吗?我可以在HashMap<Oid,Branch>
周围构建一个包装器结构体,但这似乎有些过度设计。
有人建议我查看如何使用Serde在序列化期间转换字段?或如何使用现有的Display trait实现来实现Serialize? - 这两者似乎都归结为使用serialize_with
- 我可能可以这样做,但我必须使用derive(Serialize)
宏,而我原本计划手动序列化GitInfo
(见下文)。或者我可以使用包装对象。
如果这些是唯一的选项,我可以接受,但似乎有点令人惊讶,没有更简单的方法 - 是否有一种方式可以从我的GitInfo
序列化中调用像serialize_with
宏使用的函数呢?
例如:
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
? - undefinedHashMap
字段的结构体GitInfo
进行序列化。因此,我正在使用serialize_struct
方法,该方法返回一个没有serialize_map
方法的SerializeStruct
对象。如果有一种方法可以调用serialize_map
来创建一个新的序列化版本的HashMap
,然后将结果作为参数插入到serialize_field
中,那就太棒了 - 但是我还没有找到这样的方法。 - undefined