私は次の設定をしています:
Kotlinデータクラス:
data class Error(val throwable: Throwable, val reloadAction: (() -> Unit)? = null) : Serializable
クラスの初期化:
val instance = Error(throwable,this::loadData)
ここで、this
はViewModel
です。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として渡す方法は他にありますか?
問題はビューモデルです:com.mypackagename.ExampleViewModel
。このクラスはシリアライズ可能ではありません。
関数参照を使用する場合、ターゲットオブジェクト(この場合はビューモデル)もシリアル化可能である必要があります。
私は同様の問題を抱えていましたが、私の問題は、データクラスがデフォルトでSerializableであるとは予期していなかったことでした。 Serializable
インターフェースの実装を忘れないことが重要です。