Kotlin:为什么@Parcelize要求在主构造函数中声明所有序列化的属性?

时间:2018-10-31 03:36:35

标签: kotlin parcelable

在许多情况下,我不需要从主构造函数传递一个字段,例如,初始化后已分配了一个字段,并已采取了一些步骤。字段直接访问全局变量(例如静态变量,例如其他持久性数据)。

现在,我有一个折衷的解决方案是在主要构造函数中使用vardefault value,或者覆盖companion object: Parceler <Model>中的所有序列化方法,这两种方法都有缺点。

为什么Kotlin设计成这样? 有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

因为这就是序列化的工作方式。例如,您有

data class User(val name: String, val id: Int)

val user = User("foo", 1)

,并且它序列化为JSON(@Parcelize不序列化为JSON。这是一个示例。)

{
  "name": "foo",
  "id": 1
}

反序列化JSON时,需要从上面的JSON重新创建对象。如果没有具有所有必填字段的主构造函数,它将无法创建相同的对象。

如果您有一个复杂的对象,则可以创建一个单独的类进行序列化,并创建一个工厂方法来接受该类。

或者您也可以自己实现Parcelable,并且可以看到为什么需要构造函数中的所有字段。