25

谁能告诉我们为什么我们需要serializable反对将一个活动传递给android中的另一个活动?Android 遵循 Java 语法。在 java 中,我们可以将对象传递给另一个类而无需序列化。

谢谢

4

4 回答 4

14

在普通的 java 程序中传递参数(对象类型),是一种为对象创建一个新的处理程序并赋予另一个方法(通常的说法是通过值传递引用)。

但是当它出现在 android 中时,将对象引用从一个活动传递到另一个活动,它们的状态必须被持久化,这是一个非常令人头疼的问题。

您可以做的一种方法是在第一个活动中创建一个静态对象并从第二个活动中访问,尽管这似乎是最简单的方法,但不能保证系统在内存中维护活动。因此,第二个活动可能会丢失对象引用。

其他方式,最推荐的方式是序列化(有点扁平化对象)对象并以额外的意图传递。在android中有两种序列化方式。

  1. 实现java的可序列化接口
  2. 实现android的parcelable接口

但是,在 android 上,使用 serializable 会严重影响性能,解决方案是使用 parcelable。

你可以在这里找到关于 android parcelable 实现的非常好的教程和解释。

于 2012-08-11T13:23:52.250 回答
13

在得到答案之前,我们需要了解以下概念:

  • AndroidBinder用于进程间进程。即使是简单的应用程序也需要它,因为操作系统和应用程序在不同的进程中运行。
  • 编组: 将更高级别的应用程序数据结构转换为包裹以便嵌入到 Binder 事务中的过程
  • Unmarshalling 从通过活页夹事务接收的包裹重构更高级别的应用程序数据结构的过程。
  • 您可以将Intents其视为更高级别的 Binder 抽象

根据以下文档,意图通信是如何发生的: 在此处输入图像描述

  1. Activity A 创建一个带有动作描述的 Intent 并将其传递给 startActivity()。

  2. Android 系统会在所有应用程序中搜索与意图匹配的意图过滤器。找到匹配项时,

  3. 系统通过调用其 onCreate() 方法并将 Intent 传递给它来启动匹配的活动(活动 B)。

为什么是 Parcelable 或 Serializable

IPC(进程间通信)要求对数据Intent进行编组和解组。Binder 为编组许多常见数据类型提供内置支持。但是,当我们定义自定义对象时,它会影响此过程,并且在此过程中收到的最终对象可能会损坏。

当您定义自定义对象时,您需要负责提供这种编组和解组,这是通过 Parcelable 和 Serializable 实现的(因为这两者之间的比较将是另一个主题,我不会在这里讨论太多)。这两者都提供了执行编组和解组的机制。这就是您需要使用 Parcelable 或 Serializable 的原因。

使用Parcelable,您可以编写用于编组和解组对象的自定义代码,从而完全控制该过程。

Serializable是一个标记接口,这意味着用户不能根据他们的要求编组数据并且它在 JVM 上完成,这不会给你任何控制权。

免责声明:以上描述是我根据一些文档对需要序列化背后的基本原理的理解

于 2018-05-04T06:21:08.457 回答
3

您的问题基本上有两个问题,所以让我们将其解耦。

为什么在 Parcelable 中编组而不是直接传递对象引用?

引用对象而不是编组/解组它们显然更快,内存效率更高。因此,当您可以直接传递对象时,您不应该使用 Parcelable。

但是,在某些情况下您可能无法访问对象引用。

  • Intent因为处理的进程可能Intent不是发出的进程Intent(它是进程间通信)
  • Activity生命周期中,例如在 中onRestoreState(),因为当用户想要恢复它时,整个应用程序可能已被 memkiller 杀死。
  • Android框架需要的其他地方

在 IPC 中,为什么要使用 Parcelable 而不是像 Java 那样使用 Serializable 呢?

那只是性能优化

于 2018-05-10T08:08:28.997 回答
2

如果我们想将对象从 Activity 传递到另一个 Activity 。我们需要保存传递​​状态。

//to pass :
   intent.putExtra("MyClass", obj);  

// to retrieve object in second Activity
getIntent().getSerializableExtra("MyClass");
于 2012-08-11T10:03:51.920 回答