Есть ли возможность сериализации класса Kotlin Data с помощью функции literal? - PullRequest
0 голосов
/ 16 октября 2018

У меня есть следующие настройки:

Класс данных Kotlin:

data class Error(val throwable: Throwable, val reloadAction: (() -> Unit)? = null) : Serializable

Инициализация класса:

val instance = Error(throwable,this::loadData)

Где this равно ViewModel от AndroidКомпоненты архитектуры

Когда я передаю этот класс данных в parcelable:

parcel.writeSerializable(instance as Serializable)

Я получаю следующее исключение:

java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.mypackagename.Error)
        at android.os.Parcel.writeSerializable(Parcel.java:1468)
        at com.mypackagename.CustomView$Companion$SavedState.writeToParcel(CustomView.kt:177)
...
Caused by: java.io.NotSerializableException: com.mypackagename.ExampleViewModel

В этом вопросе: IsЕсть ли способ передать ссылку на функцию между действиями? - это следующий ответ:

На самом деле он будет сериализуемым, если это ссылка на функцию (SomeClass :: someFunction) или лямбда-выражение.Но это может быть не так, если это какая-то пользовательская реализация функционального интерфейса () -> Unit, поэтому вы должны проверить это и обработать случаи, когда это не так.

Это мой случай?Или класс данных не может быть сериализован, когда функция является функцией не сериализуемого объекта (ViewModel)?Существуют ли другие способы передачи литерала функции как Serializable внутри класса данных?

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

У меня была похожая проблема, моя проблема заключалась в том, что я не ожидал, что класс данных не будет сериализуемым по умолчанию.Важно не забыть реализовать интерфейс Serializable.

0 голосов
/ 16 октября 2018

Проблема в представлении модели: com.mypackagename.ExampleViewModel.Этот класс не сериализуем.

Если вы используете ссылку на функцию, целевой объект - в данном случае модель представления - тоже должен быть сериализуемым.

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