【问题标题】:Is there a possibility to serialize Kotlin Data class with function literal?是否有可能用函数文字序列化 Kotlin Data 类?
【发布时间】:2018-10-16 14:36:00
【问题描述】:

我有以下设置:

Kotlin 数据类:

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

类的初始化:

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

其中 this 是 Android 架构组件中的 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

在这个问题中:Is there a way to pass a function reference between activities? 是以下答案:

如果它是函数引用 (SomeClass::someFunction) 或 lambda,它实际上是可序列化的。但它可能不是,如果它是功能接口 () -> 单元的一些自定义实现,所以你应该检查它并处理不是的情况。

这是我的情况吗?或者当函数是不可序列化对象(ViewModel)的函数时,不能序列化数据类?是否有任何其他可能性如何在数据类中将函数文字作为 Serializable 传递?

【问题讨论】:

标签: android serialization kotlin


【解决方案1】:

问题在于视图模型:com.mypackagename.ExampleViewModel。这个类是不可序列化的。

如果你使用函数引用,目标对象——在这种情况下是视图模型——也必须是可序列化的。

【讨论】:

  • 好吧,我就是这么想的。还有其他选择吗?显然我不能让我的视图模型可序列化。
  • 您可以将函数类型更改为(ReloadContext) -> Unit。现在,每个重新加载函数都会获得一个上下文对象。此上下文提供对重新加载数据所需的所有瞬态/不可序列化对象的访问。每当您调用 reload 函数时,您都必须提供一个上下文对象。 reload 函数本身应该驻留在可序列化的类中,因此函数引用也是可序列化的。
【解决方案2】:

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

【讨论】:

  • 是的,为什么 data class 不是 serializable ??
猜你喜欢
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
相关资源
最近更新 更多