#有序 #serde #序列化 #排序 #映射 #哈希映射

serde-ordered-collections

有序序列化/反序列化serde功能

1个稳定版本

2.0.0 2023年2月21日

#2108数据结构

MIT/Apache

8KB
142

serde-ordered-collections

一个序列化函数,用于与serde_derive的serialize_with注解一起使用,在序列化时根据键的Ord实现对映射或列表结构中的条目进行排序。

此库支持实现了IntoIterator<Item = (K, V)>的任何内容,其中K: Ord,或者实现了IntoIterator<Item = V>的任何内容,其中V: Ord。例如包括std::collections::HashMapstd::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