高效的 Json 解析框架 kotlinx.serialization - SharpCJ

高效的 Json 解析框架 kotlinx.serialization - SharpCJ

💡 原文中文,约10300字,阅读约需25分钟。
📝

内容提要

本文讨论了使用Gson进行对象序列化时的异常,特别是抽象类无法实例化的问题。为解决此问题,需要为抽象类注册TypeAdapter或InstanceCreator。同时,介绍了Kotlin团队开发的kotlinx.serialization库,提供了更简便的序列化和反序列化方案,避免了Gson的限制。通过示例展示了如何使用kotlinx.serialization处理密封类和默认值问题。

🔎

延伸解读

Gson 处理抽象类的局限与应对

Gson 默认的 TypeAdapter 会将抽象类属性序列化为空对象,导致反序列化时抛出“Abstract classes can't be instantiated”异常。文章指出,必须通过 registerTypeAdapter 或 registerTypeHierarchyAdapter 为抽象类注册自定义的 TypeAdapter 或 InstanceCreator。前者针对特定类型,后者则适用于类及其所有子类,使用时需确保能正确处理所有子类,否则仍可能失败。

kotlinx.serialization 的默认值优势

与 Gson 不同,kotlinx.serialization 在反序列化时能正确应用 Kotlin 属性的默认值。例如,当 JSON 中缺少 name 字段时,若 name 有默认值,则自动赋为默认值;若没有默认值,即使属性可空,也必须显式提供值(如 null),否则反序列化失败。这体现了该库对 Kotlin 语言特性的良好支持。

密封类序列化的实现差异

对于密封类,kotlinx.serialization 要求所有子类都添加 @Serializable 注解,序列化时会自动生成包含类型信息的 JSON 对象,如 {"type":"包名.类名"}。反序列化时,库根据该类型信息实例化对应子类。而 Gson 需要手动注册 TypeAdapter 并自行处理类型标识,否则无法正确反序列化。

选择序列化库的考量

文章通过对比表明,kotlinx.serialization 为 Kotlin 对象提供了更原生的支持,能自动处理密封类、默认值等特性,减少手动配置。而 Gson 作为 Java 序列化框架,在 Kotlin 环境下可能丢失部分语言特性,需要额外注册适配器。若项目以 Kotlin 为主且需多平台支持,kotlinx.serialization 是更简便的选择。

❓

Q&A

使用Gson进行对象序列化时,抽象类无法实例化的原因是什么?

抽象类无法实例化是因为它们是抽象的,不能直接被实例化,导致序列化时出现异常。

如何解决Gson序列化时抽象类无法实例化的问题?

可以通过为抽象类注册TypeAdapter或InstanceCreator来解决该问题。

kotlinx.serialization库相比Gson有哪些优势?

kotlinx.serialization提供了更简便的序列化和反序列化方案,支持多种格式,并且避免了Gson的限制。

在使用kotlinx.serialization时,如何处理抽象类和密封类?

所有涉及的抽象类及其子类都需要加上@Serializable注解,以便正确序列化和反序列化。

kotlinx.serialization如何处理默认值?

kotlinx.serialization支持默认值,反序列化时可以自动赋值,避免了Gson的限制。

在kotlinx.serialization中,如何处理可空类型的反序列化?

如果可空类型没有默认值,反序列化时必须提供值,否则会失败。

🏷️

标签

➡️

继续阅读