如何序列化自定义类型的ArrayList?Kotlin中ArrayList<Location>序列化问题
解决方案
问题原因
你之前的注解写法不生效,是因为你把Location类型的序列化器直接指定给了ArrayList<Location>类型的wpts属性,序列化器和属性类型不匹配,所以框架依旧找不到Location类型的序列化器。
解决方法
你可以选择下面任意一种方案实现:
方案1:文件级全局绑定序列化器(最简便)
在定义包含wpts属性的类的Kotlin文件顶部,添加UseSerializers注解,全局指定该文件内所有Location类型都用你自定义的序列化器:
@file:UseSerializers(LocationSerializer::class) // 后续正常写包名、导入语句、包含wpts的类定义即可
方案2:仅给wpts属性单独指定
如果你不想影响文件内其他Location类型的序列化,可以直接在属性的泛型参数上指定序列化器:
@Serializable // 外层类必须加这个注解 class 你的外层类名 { var wpts: ArrayList<@Serializable(with = LocationSerializer::class) Location> = arrayListOf() }
方案3:注册全局序列化模块(适用全项目共用)
如果你的整个项目都需要用这个序列化器处理Location类型,可以在构造Json对象的时候注册序列化模块,不用在每个使用的地方加注解:
val json = Json { serializersModule = SerializersModule { contextual(Location::class, LocationSerializer) } } // 后续用这个自定义的json对象做序列化/反序列化即可
额外检查项
如果按照上面操作依旧报错,请确认以下配置:
- 包含
wpts属性的外层类,本身已经添加了@Serializable注解 - 你引入的
LocationSerializer路径正确,没有导包错误 - 模块的build.gradle已经正确应用kotlinx-serialization插件,依赖版本匹配
Serializer has not been found for type 'Location'.
内容的提问来源于stack exchange,提问作者CaptainNemo
相关产品推荐
相关产品推荐

