com.google.gson.JsonIOException:抽象类无法实例化!为该类型注册一个 InstanceCreator 或 TypeAdapter

问题描述 投票:0回答:1

当我尝试将歌曲列表插入 Playlist 类时,应用程序崩溃。我正在使用新的 Android studio 版本 Flamingo 和类型转换程序来转换模型类列表。 这是我的转换器类,我已将类型转换器添加到我的数据库类中。

class DataConverters {

    @TypeConverter
    fun toSongList(string: String): List<Song> {
        val listType = object : TypeToken<List<Song>>() {}.type
        return Gson().fromJson(string, listType) //here crash
    }

    @TypeConverter
    fun fromSongList(list: List<Song>): String {
        return Gson().toJson(list) 
    }

}

这是我的歌曲模型课

@Entity(tableName = "song")
data class Song(
    val displayName:String,
    val artist:String,
    val data:String,
    val duration:Int,
    val title:String,
    val album: String,
    val uri: Uri,
    val artUri: String,
    val dateAdded: String,
    @PrimaryKey val id:Long
){
    fun doesMatchSearchQuery(query: String): Boolean {
        val matchingCombinations = listOf(
            displayName
        )

        return matchingCombinations.any {
            it.contains(query, ignoreCase = true)
        }
    }
}

这是我的播放列表课程。

@Entity(tableName = "playlist")
data class Playlist(
    @PrimaryKey val playlistName: String,
    val songCount: Int,
    val playlistDuration: Long,
    val songs: List<Song>,
)

我尝试添加一些混淆规则,但没有帮助我。

android kotlin android-room typeconverter
1个回答
0
投票

我认为错误来自

val uri: Uri
,因为 Gson 不知道如何反序列化 Uri。

您应该为此类型注册一个适配器

class UriJsonAdapter: JsonSerializer<Uri>, JsonDeserializer<Uri> {
    override fun serialize(src: Uri, typeOfSrc: Type, context: JsonSerializationContext): JsonElement {
        return JsonPrimitive(src.toString())
    }
    
    override fun deserialize(src: JsonElement, srcType: Type, context: JsonDeserializationContext): Uri {
        return try {
            val url = src.asString
            if (url.isNullOrEmpty()) {
                Uri.EMPTY
            } else {
                Uri.parse(url)
            }
        } catch (e: UnsupportedOperationException) {
            Uri.EMPTY
        }
    }
}

GsonBuilder().registerTypeAdapter(Uri::class.java, UriJsonAdapter())
© www.soinside.com 2019 - 2024. All rights reserved.