我有一个HashMap
作为我手动序列化的结构体中的值:
pub struct GitInfo {
pub branches: HashMap<Oid, Branch>,
}
字符串Branch
是我定义的,但Oid
是我不拥有的外部类型,我很乐意使用to_string()
方法。
我读过How do I use Serde to serialize a HashMap with structs as keys to JSON?,但它引用了作者定义的键-我不能为Oid
实现Serialize
,因为它不在我的crate中。出于类似的原因,我不能为HashMap<Oid, Branch>
实现Serialize
。
有什么方法可以解决这个问题吗?我可以围绕HashMap<Oid, Branch>
构建一个 Package 器结构体,但这似乎有点大材小用。
有人建议我使用How to transform fields during serialization using Serde?或How can I implement Serialize using an existing Display trait implementation?--这两种方法似乎都可以归结为使用serialize_with
--我也可以这样做,但是当我计划手动序列化GitInfo
时,我必须使用derive(Serialize)
宏(见下文)。
如果这些是唯一的选择,我可以接受它,但似乎有点令人惊讶的是,没有一个更简单的方法-有没有一些方法来调用像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()
}
}
型
1条答案
按热度按时间h7appiyu1#
当将
HashMap<Oid, Branch>
存储在GitInfo
结构中时,您不需要围绕HashMap<Oid, Branch>
构建 Package 器结构,但当以自定义方式序列化HashMap
时,您将需要使用 Package 器结构。您可以在Serialize
实现中定义新的 Package 器结构,以指示它应仅用于序列化。字符串
下面是一个playground,展示了这个解决方案的基本实现。
请注意,
serialize_with
生成的代码遵循相同的模式:它定义了一个newtype Package 器结构沿着Serialize
实现,并在trait实现中调用您提供的函数。