33

我想知道确切的,

  1. 我是否应该使用parcelableserialization技术将数据从一个活动发送到另一个活动?
  2. 是否必须使用其中之一将数据从一个发送到另一个?
  3. 我什么时候应该使用它们?
  4. 以及它们之间的确切区别以及它们在java方面的性能。

提前致谢。


 public class GetSetClass implements Serializable {
    private int dt = 10;

    /** pass any object, drwabale */
    public int getDt() {
        return dt;
    }

    public void setDt(int dt) {
        this.dt = dt;
    }
}
4

5 回答 5

29

这些概念与进程间通信 (IPC) 有关。

在两个应用程序之间发送数据时,我们必须确保两个应用程序都应该了解正在发送的数据的格式。

特别是当您在两个应用程序之间发送非原始数据类型值(如类和对象)时,我们必须将它们转换为操作系统可理解的格式。操作系统只理解原始类型(整数、字符等)。转换的原因是我们必须通过 OS 通信通道来传输数据。

这种将非原始类型转换为原始类型并通过某个通信通道发送到其他应用程序的过程称为序列化。逆过程称为反序列化。

在 Java 中,IPC 严重依赖于 Serializable 进行序列化。但是序列化是通过牢记桌面应用程序来设计的。当您在移动应用中进行 IPC 时,我们必须确保 IPC 的过程不会太繁重。

简单来说,序列化对于 IPC 来说是一个沉重的概念。因此代替序列化,Android 选择了 Binder 来实现轻量级的进程间通信。Binder 在内部很大程度上依赖于包裹,来做 IPC。包裹是轻量级的可序列化对象。最好使用包裹将对象编组为字节流。

注意:Binder IPC 很大程度上依赖于共享内存的概念,以确保在应用程序之间共享时没有太多的数据重复。

于 2013-12-04T12:57:52.217 回答
19

我是否应该使用可打包或序列化技术将数据从一个活动发送到另一个活动。

如果您通过 将非原始类型数据/对象发送到另一个活动,则intent您必须为该对象Serialize实现或实现。Parcelable首选技术是Parcelable因为它不会影响性能。

是否必须使用其中之一将数据从一个发送到另一个。/ 我什么时候应该使用它们。

它只是强制/用于发送非原始类型数据对象。

以及它们之间的确切区别以及它们在java方面的性能。

序列化确实会影响性能。有关更多详细信息,请查看此链接Android Parcelable and Serializable

于 2012-06-18T06:41:40.813 回答
6

很好地解释了 Parcelable 和 Serialization 之间的区别。

从你的问题开始,虽然它已经很长时间了,它可能会帮助其他人:

  1. 我是否应该使用可打包或序列化技术将数据从一个活动发送到另一个活动?

Ans: Parcelable 是最好的选择(为什么稍后解释)。

  1. 是否必须使用其中之一将数据从一个发送到另一个?

回答:是的,因为从一个发送数据(对象)到另一个需要写入和检索字节流,这可以通过可打包或序列化来完成。

  1. 我什么时候应该使用它们?

回答:这部分你已经回答了,即将数据从一个活动传递到另一个活动。

  1. 以及它们之间的确切区别以及它们在java方面的性能。

Ans: 1. Parcelable 在 Android SDK 中有很好的记录;另一方面,序列化在 Java 中可用。

  1. 在 Parcelable 中,开发人员编写用于编组和解组的自定义代码,因此与序列化相比,它创建的垃圾对象更少。由于这种自定义实现,Parcelable over Serialization 的性能显着提高(大约快两倍)。

  2. 序列化是一个标记接口,这意味着用户不能根据他们的要求编组数据。在序列化中,使用 Java 反射 API 在 Java 虚拟机 (JVM) 上执行封送操作。这有助于识别 Java 对象的成员和行为,但最终也会创建大量垃圾对象。因此,与 Parcelable 相比,序列化过程很慢。

答案来自: 此链接

另见:序列化解释

于 2015-06-19T07:43:15.940 回答
3

Java Serializable:- Serializable 来自标准 Java,实现起来要容易得多,您需要做的就是实现 Serializable 接口并添加覆盖两个方法。
Serializable 的问题在于它试图适当地处理阳光下的一切,并使用大量反射来确定正在序列化的类型。所以它变成了一个强壮的对象。

Androids Parcelable :- Android 进程间通信 (AIPC) 文件告诉 Android 应该如何编组和解组您的对象。它不太通用并且不使用反射,因此它应该有更少的开销并且更快。

阅读更多来自http://www.3pillarglobal.com/blog/parcelable-vs-java-serialization-android-app-development

于 2013-12-04T11:34:09.770 回答
2

打包和序列化都是编组和解组数据的方法。在 android 中,这用于在组件和进程之间传递非原始数据类型。通常,android 允许可序列化或可打包的对象,因此您可以选择您的方法。AIDL 接口除外。对象必须是可包裹的才能被传递/返回。

序列化使用反射来自动编组和解组数据。在大多数情况下,实现标记接口就足以使其正常工作。使用 parceling,您必须自己编写代码来编组和解组数据。

因此,这就是包裹速度更快的原因。对象不需要被反射来发现字段。是反射使它变慢。

序列化还具有内置版本控制……如果您尝试解组到已编组的对象类的不同版本,则该过程将以可预测的方式失败。使用 parceling,您可以做同样的事情,但您需要自己实现它,方法是向您的对象添加“版本”字段,以及在解组时检查版本的代码。

话虽如此,我通常使用序列化。对于简单的对象,您不会注意到差异。如果您发现性能问题,您可以随时更改为在开发后期使用 parceling。

于 2013-08-01T20:32:59.637 回答