自定义Key类型的字典无法序列化的N种解决方案 - Artech

自定义Key类型的字典无法序列化的N种解决方案 - Artech

💡 原文中文,约8300字,阅读约需20分钟。
📝

内容提要

本文讨论了在使用System.Text.Json.JsonSerializer序列化字典对象时,字典的键不能是自定义类型(如Point)的解决方案。提出了通过自定义PointKeyedDictionaryConverter以键值对形式有效序列化字典的方法,避免了创建中间对象,从而提升了性能。

🎯

关键要点

  • 使用System.Text.Json.JsonSerializer序列化字典时,自定义类型(如Point)不能作为字典的键。

  • 默认情况下,序列化Dictionary<Point, int>会抛出NotSupportedException异常。

  • 自定义JsonConverter和TypeConverter均无法解决字典键为自定义类型的问题。

  • 提出了通过自定义PointKeyedDictionaryConverter<TValue>以键值对形式序列化字典的方法。

  • 该方法避免了创建中间对象,从而提升了性能。

  • 可以将以Point为键的字典转换为以字符串为键的字典以解决问题。

  • 最终的解决方案通过自定义JsonConverter控制JSON内容的读写,生成的JSON结构与预期一致。

延伸问答

为什么自定义类型不能作为字典的键进行序列化?

自定义类型在使用System.Text.Json.JsonSerializer序列化字典时会抛出NotSupportedException异常,因为默认情况下字典的键必须是可序列化的类型。

如何解决自定义类型作为字典键无法序列化的问题?

可以通过自定义PointKeyedDictionaryConverter<TValue>以键值对形式序列化字典,避免创建中间对象,从而提升性能。

使用Newtonsoft.Json序列化自定义类型字典有什么不同?

使用Newtonsoft.Json可以成功序列化自定义类型字典,但反序列化时会失败,而System.Text.Json则在序列化时直接抛出异常。

自定义JsonConverter能否解决字典键为自定义类型的问题?

自定义JsonConverter无法解决字典键为自定义类型的问题,因为异常在序列化字典时就已抛出,而不是在处理Point对象时。

如何将以Point为键的字典转换为以字符串为键的字典?

可以通过重写PointKeyedDictionaryConverter<TValue>中的Write和Read方法,将Dictionary<Point, TValue>转换为Dictionary<string, TValue>进行序列化和反序列化。

自定义PointKeyedDictionaryConverter<TValue>的性能优势是什么?

该方法避免了创建中间对象,从而提升了性能,直接以键值对形式进行序列化和反序列化。

🏷️

标签

➡️

继续阅读