我用serde序列化一个HashMap
,如下所示:
#[derive(Serialize, Deserialize)]
struct MyStruct {
map: HashMap<String, String>
}
HashMap
的密钥顺序是未指定的,并且由于散列是随机化的(参见documentation),所以密钥实际上在相同的运行之间以不同的顺序出现。
我希望我的HashMap
以排序(例如字母)键顺序序列化,以便序列化是确定的。
我可以使用BTreeMap
而不是HashMap
来实现这一点,因为BTreeMap::keys()
按排序顺序返回其键,但是我不希望仅仅为了适应序列化逻辑而更改数据结构。
如何让serde在序列化之前对HashMap
键进行排序?
2条答案
按热度按时间kr98yfug1#
使用
serialize_with
字段属性:在这里,我选择从
HashMap
重新构建整个BTreeMap
,然后重用现有的序列化实现。mf98qq942#
这是一种稍微通用一点的自动排序方法,它使用itertools,并且只依赖于std库。
上述两个函数都可以与以下结构一起使用: