有没有可能使用函数字面值序列化Kotlin数据类?

4

I have following setup:

Kotlin data class:

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

类的初始化:

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

这里的 this 是来自于 Android Architecture 组件中的 ViewModel

当我将这个数据类传递给 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)或lambda,则实际上将其序列化。但是,如果它是函数接口 () -> Unit 的自定义实现,则可能不是,因此应检查并处理其不是的情况。

这是我的情况吗? 或者当函数是非可序列化对象(ViewModel)的函数时,数据类不能被序列化? 有没有其他可能性可以将函数文本作为Serializable传递到数据类中?


我创建了一个包装器TrackedReference<Any>,它是可包裹和可序列化的,而不需要对底层类型进行编组:https://dev59.com/2FcO5IYBdhLWcg3wjCQt#64944753 - Lukas
2个回答

4
问题在于视图模型:com.mypackagename.ExampleViewModel。这个类不可序列化。
如果您使用函数引用,目标对象(在此情况下是视图模型)也必须是可序列化的。

好的,这正是我想的。还有其他选项吗?显然我不能将我的视图模型序列化。 - Jarda Havelik
你可以将函数类型更改为(ReloadContext) -> Unit。现在每个重新加载函数都会得到一个上下文对象。该上下文提供了访问重新加载数据所需的所有瞬态/不可序列化对象的方法。每当调用重新加载函数时,您必须提供一个上下文对象。重新加载函数本身应驻留在可序列化类中,以便函数引用也是可序列化的。 - Rene

4

我遇到了类似的问题,我的问题是我没有预料到数据类默认情况下不可序列化。重要的是不要忘记实现 Serializable 接口。


2
为什么data class不会是serializable呢? - WestCoastProjects

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接