Как сериализовать / десериализовать Kotlin enum класс с конструктором в json - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь сохранить enum-класс в Room db. Мой класс:

enum class TestClass(val firstField: String, secondField: Long) {
    FIRST("test", 1L),
    SECOND("test_2", 2L),
    THIRD("test_3", 3L)
}

Мои TypeConverters:

    @TypeConverter
    fun jsonToTestClassList(json: String) = Gson().fromJson<MutableSet<TestClass>>(json)

    @TypeConverter
    fun testClassToJson(testClassSet: MutableSet<TestClass>?) = Gson().toJson(testClassSet)

Когда я сохраняю его в комнату, он показывает только перечисления, а не конструкторы перечисления. Например, если список имеет 2 перечисления, он сохраняется как

["FIRST", "SECOND"]

Как мне добиться сериализации и десериализации, чтобы сохранить параметры конструктора, например,

[{FIRST, "test", 1L}, {SECOND, "test_2", 2L}]

Или что-то подобное, чтобы получить Параметры конструктора Назад.

ОБНОВЛЕНИЕ:

Я понял это; Я только что создал новый класс, и в TypeConverter я преобразовал свое перечисление в класс, новый класс, который я только что создал.


    @TypeConverter
    fun jsonToTestClassList(json: String): MutableSet<TestClass>? {
        return Gson().fromJson<List<TestClassDatabase>?>(json)?.map {
            it.testClass.apply {
                firstField = it.firstField
            }
        }?.toMutableSet()
    }

    @TypeConverter
    fun testClassToJson(testClassList: MutableSet<TestClass>?): String {
        return Gson().toJson(testClassList?.run {
            mutableListOf<TestClassDatabase>().apply {
                addAll(testClassList.map {
                    TestClassDatabase(it, it.firstField)
                })
            }
        })
    }

Не мой гордый код, но вы поняли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...