有人可以告诉我们为什么需要serializable
对象将一个活动传递给android中的另一个活动吗? Android遵循Java语法。在java中,我们可以将对象传递给另一个没有可序列化的类。
由于
答案 0 :(得分:13)
在传递参数(对象类型)的普通java程序中,有一种为对象创建一个新的处理程序并赋予另一个方法(在常规单词中按值传递引用)。
但是当它出现在android中时,将对象引用从活动传递到活动,其状态必须持久化,这是一个严重的问题。
您可以做的一种方法是在第一个活动中创建一个静态对象,然后从第二个活动中创建一个静态对象,尽管这似乎是最简单的方法there is no guarantee that the system maintains the activity in the memory。因此,第二个活动可能会丢失对象引用。
其他方式,最常推荐的方法是序列化(对象展平对象)对象并以intent作为额外传递。在android中有两种序列化方法。
然而,在android上,使用serializable会带来严重的性能损失,解决方案是使用parcelable。
你可以在android parcelable实现here找到一个非常好的教程和解释。
答案 1 :(得分:8)
在得到答案之前,我们需要了解以下概念:
Binder
进行进程间处理。即使对于简单的应用程序也是如此,因为操作系统和应用程序在不同的进程中运行。Intents
视为Binder 基于documentation以下是意图通信的发生方式:
活动A创建一个带有动作描述的Intent并传递 它来startActivity()。
Android系统会搜索所有应用以获取意图过滤器 匹配意图。找到匹配项后,
- 醇>
系统通过调用启动匹配活动(活动B) 它的onCreate()方法并将其传递给Intent。
IPC(进程间通信)要求Intent
中的数据为Marshalled和unMarshalled。 Binder为编组许多常见数据类型提供内置支持。但是,当我们定义自定义对象时,它会影响此过程,并且在此过程中收到的最终对象可能已损坏。
当你定义自定义对象时,你需要负责提供这种通过Parcelable和Serializable实现的编组和解组(因为这两者之间的比较将是我赢得的另一个主题,在这里讨论很多)。这两者都提供了执行编组和解组的机制。这就是您需要使用Parcelable或Serializable的原因。
使用 Parcelable 编写用于编组和解组对象的自定义代码,从而您可以完全控制该过程。
Serializable 是一个标记界面,这意味着用户无法根据他们的要求和JVM完成数据编组,JVM没有给予您任何控制权。
免责声明:以上说明是我对基于某些需要序列化的理由的理解 文档
答案 2 :(得分:3)
你的问题基本上有两个问题,所以让我们解开它。
引用对象显然更快,内存效率更高,而不是对它们进行编组/解组。因此,当您可以直接传递对象时,不应使用Parcelable。
但是,您可能无法访问对象引用。
Intent
中,因为处理Intent
的进程可能不是发出Intent
的进程(这是进程间通信)Activity
生命周期中,例如在onRestoreState()
中,因为当用户想要恢复时,整个应用可能已被memkiller杀死。答案 3 :(得分:2)
如果我们想将对象从Activity传递给Another Activity。我们需要保存通过状态。
//to pass :
intent.putExtra("MyClass", obj);
// to retrieve object in second Activity
getIntent().getSerializableExtra("MyClass");