【问题标题】:Android can't serialize Kotlin lambdaAndroid 无法序列化 Kotlin lambda
【发布时间】:2019-10-28 23:22:15
【问题描述】:

我们可以读取 lambda 函数默认为序列化 (https://discuss.kotlinlang.org/t/are-closures-serializable/1620),
但我收到错误:

java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.example.dialogfragment.Arguments)

我的班级论点:

class Arguments(val function: ()-> Unit) : Serializable

我的 lambda 有什么问题?
(由于内存不足,Android 需要杀死我的 Fragment 时出现此错误 :))

【问题讨论】:

  • 由于内存不足,Android 不会“杀死”片段。由于内存不足,Android 会终止进程。关于您的Serializable 问题,我不希望尝试将 lambda 表达式写入磁盘来工作,我也不希望尝试将 lambda 表达式保存为已保存的实例状态 Bundle 来工作。
  • 但保存到 Bundle 中的功能接口可以工作
  • 最可能的问题是您的 lambda 包含对不可序列化对象的引用。
  • @CommonsWare 实际上将 lambda 表达式序列化并放入 Fragment. arguments 工作得很好。但是当onSaveInstanceState 被称为应用程序崩溃时,这是不正常的。我的意思是当从/到Fragment.arguments 序列化/反序列化时它是如何工作的,但是当调用onSaveInstanceState 时它会崩溃?
  • @Farid:“实际上将 lambda 表达式序列化并放入 Fragment。参数工作得很好”——您的其余评论说明了为什么不是这种情况。保存的实例状态Bundle 是要跨进程边界传递的,你不能那样传递代码。

标签: android kotlin serialization jvm


【解决方案1】:

如果您想序列化或打包某些内容,您需要确保每个字段都是可序列化或可打包的。 在您的情况下,您正在尝试序列化不可序列化的val function: ()-> Unit。不幸的是,您不能使函数可序列化。你应该重新考虑这个参数类并传递一些不同的东西。可能你可以得到一些参数来做出决定,然后在你的片段中调用一个函数。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 2020-02-27
  • 2021-01-05
  • 2020-02-28
  • 1970-01-01
相关资源
最近更新 更多