web-dev-qa-db-ja.com

Kotlin Dataクラスを関数リテラルでシリアル化する可​​能性はありますか?

私は次の設定をしています:

Kotlinデータクラス:

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

クラスの初期化:

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

ここで、thisViewModelです。fromAndroidアーキテクチャコンポーネント

このデータクラスを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

この質問では: アクティビティ間で関数参照を渡す方法はありますか? は次の答えです:

関数参照(SomeClass :: someFunction)またはラムダの場合、実際にはSerializableになります。しかし、それが機能インターフェース()->ユニットのカスタム実装である場合はそうではない可能性があるため、それを確認し、そうでない場合は処理する必要があります。

これは私のケースですか?または、関数がシリアル化できないオブジェクト(ViewModel)の関数である場合、データクラスをシリアル化できませんか?データクラス内で関数リテラルをSerializableとして渡す方法は他にありますか?

3
Jarda Havelik

問題はビューモデルです:com.mypackagename.ExampleViewModel。このクラスはシリアライズ可能ではありません。

関数参照を使用する場合、ターゲットオブジェクト(この場合はビューモデル)もシリアル化可能である必要があります。

3
Rene

私は同様の問題を抱えていましたが、私の問題は、データクラスがデフォルトでSerializableであるとは予期していなかったことでした。 Serializableインターフェースの実装を忘れないことが重要です。

2
Vojtěch