【发布时间】:2021-06-01 12:50:08
【问题描述】:
我有一个 API,它要求对象的字段按字母顺序排序,因为必须对结构进行哈希处理。
在 Java/Jackson 中,您可以在序列化程序中设置一个标志:MapperFeature.SORT_PROPERTIES_ALPHABETICALLY。我在 Serde 中找不到类似的东西。
我正在使用rmp-serde (MessagePack)。它遵循用于JSON的注释和序列化过程,所以我认为它会完全兼容,但是the sorting provided by @jonasbb不适合它。
该结构有(很多)嵌套的枚举和结构,它们必须被展平以获得最终表示。我为此使用Serialize::serialize,但在正确的位置调用state.serialize_field(这样所有内容都按字母顺序排列)很痛苦,因为枚举需要match 子句,因此必须多次调用它字段在不同的地方,代码很难理解。
作为可能的解决方案,两个想法:
-
使用平面表示创建一个新结构并手动按字母顺序对字段进行排序。
这有点容易出错,所以这个扁平结构的编程排序解决方案会很棒。
-
缓存
Serialize::serialize中的键值(例如在一个BTreeMap中,已排序),最后在循环中调用state.serialize_field。问题是这些值似乎必须是
Serialize类型,这不是对象安全的,所以我无法弄清楚如何将它们存储在地图中。
How to sort HashMap keys when serializing with serde? 相似但不相关,因为我的问题是关于结构的字段/属性的排序。
【问题讨论】:
-
如果它们是数组,只需对它们进行预排序。如果它们是类似对象的,那并不重要,因为反序列化对象可以根据它的内容任意对它们进行排序。
-
@Netwave 它类似于对象,这很重要,因为我与之交互的端点要求它们按字母顺序排序。
-
@Netwave 最常见的 C# json 框架也需要 "$type" 是第一个,但这只是一个问题,如果你不能修改接收器(或接收器需要高性能),如果您需要在数据结构中具有动态类型。我的观点是,订单的重要性并非闻所未闻。