使用抽象参数将 class 序列化为 JSON

Serialize class with abstract parameter to JSON

我有 3 个 classes:

  1. GameResultList 基本上是 ArrayList,里面有一些辅助方法
  2. GameResult 具有抽象值 gameMode
  3. GameMode
public class GameResultList extends ArrayList<GameResult> {
    ...
}
class GameResult(
    val gameMode: GameMode,
    val score: Int,
    timeSpentInSeconds: Int,
    val completionDateTime: Date
) {
    ...
}

游戏模式class:

abstract class GameMode(
    val suggestionsActivated: Boolean,
    val screenOrientation: ScreenOrientation // enum: PORTRAIT, HORIZONTAL
) {
    ...
}

我需要将 GameResultList 序列化为 JSON。

由于参数gameMode是抽象的,Gson抛出异常。经过一番研究,我决定尝试一下 Moshi。我添加了 PolymorphicJsonAdapterFactoryKotlinJsonAdapterFactory,但结果总是空的 ({})。

我如何设置 Moshi:

    private val moshi =
        Moshi.Builder().add(PolymorphicJsonAdapterFactory.of(GameMode::class.java, "GameMode")
            .withSubtype(GameOnTime::class.java, "GameOnTime")
            .withSubtype(GameOnCount::class.java, "GameOnCount"))
            .add(KotlinJsonAdapterFactory())
            .build()
    private val jsonAdapter: JsonAdapter<GameResultList> = moshi.adapter(GameResultList::class.java)

此 returns 空 JSON 响应: jsonAdapter.toJson(gameResultList)

那么如何序列化 GameResultList?有简单的方法吗?还有,不一定要用Moshi,为了方便起见,可以用别的。

经过一些调查,我发现主要问题是数组列表需要显式转换器。

class GameResultListToJsonAdapter {

    @ToJson
    fun arrayListToJson(list: GameResultList): List<GameResult> = list

    @FromJson
    fun arrayListFromJson(list: List<GameResult>): GameResultList = GameResultList(list)

}

此外,处理 Date 类型时存在问题,我已将其替换为 Long 以避免创建另一个显式转换器。