为什么我们需要序列化对象才能将一个活动传递给Android中的另一个活动
任何人都可以说出为什么我们需要反对将一个活动传递给Android中的另一个活动吗?Android遵循Java语法。在java中,我们可以将对象传递给另一个类,而无需可序列化。serializable
谢谢
任何人都可以说出为什么我们需要反对将一个活动传递给Android中的另一个活动吗?Android遵循Java语法。在java中,我们可以将对象传递给另一个类,而无需可序列化。serializable
谢谢
在普通的java程序中,传递参数(Object类型),是一种为对象创建一个新的处理程序并提供给另一个方法(在常规单词中,通过值传递引用)。
但是,当涉及到Android时,将对象引用从一个活动传递到另一个活动,其中它们的状态必须持久化,这是一个令人头疼的问题。
一种方法是在第一个活动中创建一个静态对象,并从第二个活动中访问,尽管这似乎是最简单的方法,但不能保证系统在内存中维护该活动。因此,第二个活动可能会丢失对象引用。
另一种方式,也是最推荐的方法是序列化(一种扁平化对象)对象,并作为额外的意图传递。在 Android 中,有两种方法可以进行序列化。
但是,在Android上,使用可序列化会带来严重的性能损失,解决方案是使用可打包。
你可以在这里找到一个关于android可包裹实现的非常好的教程和解释。
在得到答案之前,我们需要了解以下概念:
Binder
Intents
根据文档,以下是意图通信的发生方式:
活动 A 创建一个带有操作描述的 Intent,并将其传递给 startActivity()。
Android 系统会搜索所有应用,以查找与意向匹配的意向过滤器。当找到匹配项时,
系统通过调用其 onCreate() 方法并向其传递 Intent 来启动匹配活动(活动 B)。
IPC(进程间通信)要求对中的数据进行编组和取消编组。Binder 为编组许多常见数据类型提供了内置支持。但是,当我们定义自定义对象时,它会影响此过程,并且在此过程中收到的最终对象可能会损坏。Intent
当您定义自定义对象时,您需要负责提供这种通过可 Parcelable 和 Serializable 实现的编组和取消编组(由于这两者之间的比较将是我在这里不讨论的另一个主题)。这两者都提供了执行编组和解组的机制。这就是您需要使用可包裹或可序列化的原因。
使用 Parcelable,您可以编写用于编组和取消编组对象的自定义代码,从而完全控制该过程。
可序列化是一个标记接口,这意味着用户无法根据他们的要求和在JVM上完成的数据进行编组,这不会在您这边进行任何控制。
免責聲明:上面的描述是我对基于某些文档进行序列化的必要性背后的基本原理的理解