1个稳定版本
2.0.0 | 2023年2月21日 |
---|
#2108 在 数据结构
8KB
142 行
serde-ordered-collections
一个序列化函数,用于与serde_derive的serialize_with
注解一起使用,在序列化时根据键的Ord
实现对映射或列表结构中的条目进行排序。
此库支持实现了IntoIterator<Item = (K, V)>
的任何内容,其中K: Ord
,或者实现了IntoIterator<Item = V>
的任何内容,其中V: Ord
。例如包括std::collections::HashMap
和std::collections::HashSet
,分别。
除了生成一个可能便于人类消费的有序列表之外,这还确保了序列化输出的确定性。HashMap/
HashSet
默认情况下将由于隐式的随机种子而进行非确定性排序;当需要一致输出时,这使其不适用。
用法
将以下注解添加到您的HashMap
(或其他映射)字段中
#[serde(serialize_with = "serde_ordered_collections::map::sorted_serialize")]
或者HashSet
(或列表)的等效注解
#[serde(serialize_with = "serde_ordered_collections::flat::sorted_serialize")]
如果您以前正在序列化一个普通的HashMap
而不是自定义类型,使用此辅助程序的最简单方法是使用一个新的单字段结构包装您的HashMap
,然后应用以下flatten
#[serde(flatten, serialize_with = "serde_ordered_collections::map::sorted_serialize")]
使用HashMap
的完整示例
use std::collections::HashMap;
use serde_derive::{Deserialize, Serialize};
#[derive(Debug, Serialize)]
struct SampleData {
#[serde(serialize_with = "serde_ordered_collections::map::sorted_serialize")]
values: HashMap<String, String>,
}
let sample_instance = SampleData {
values: {
let mut map = HashMap::new();
map.insert("c".into(), "ghi".into());
map.insert("a".into(), "abc".into());
map.insert("b".into(), "def".into());
map
},
};
let serialized_string = serde_yaml::to_string(&sample_instance).unwrap();
assert_eq!(&serialized_string, "\
---
values:
a: abc
b: def
c: ghi
");
依赖关系
~110–345KB