Android中使用的Parcelable和Serialization有什么区别?

我想知道确切的,

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

提前致谢。


  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; } } 

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

如果通过intent将非基元types的data / Object发送到另一个activity,则必须为该对象Serialize或实现Parcelable 。 首选技术是Parcelable因为它不影响性能。

是否有必要使用其中之一来发送数据。 /我应该什么时候使用它们?

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

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

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

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

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

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

将非原始types转换为原语并通过某个通信通道发送到其他应用程序的过程称为序列化。 反过程称为De序列化。

在Java中,IPC在很大程度上依赖于Serializables的序列化。 但是序列化是通过记住桌面应用程序来devise的。 当您在移动应用程序中使用IPC时,我们必须确保IPC的过程不会太重。

简单来说,序列化对于IPC来说是一个沉重的概念。 所以代替序列化Androidselect了Binders来实现轻量级的进程间通信。 内部粘合剂在很大程度上取决于包裹,做IPC。 包裹是轻量级可序列化的。 最好使用parcel将对象封送到字节stream中。

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

对Parcelable和Serialization之间的区别有很好的解释。

从长久的问题开始,可以帮助其他人:

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

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

  1. 使用其中之一将数据从一个发送到另一个是强制的吗?

答:是的,当发送数据(对象)从一个到另一个时,需要写入和检索字节stream,并且可以通过可分段或序列化来完成。

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

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

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

答案:1.在Android SDK中,Parcelable有很好的文档logging; 另一方面,序列化在Java中可用。

  1. 在Parcelable中,开发人员编写自定义代码进行封送和反编组,因此与序列化相比,它创build的垃圾对象更less。 由于这个自定义的实现,Parcelable over Serialization的性能大大提高了(大约快两倍)。

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

回答采取: 此链接

另请参阅: 序列化解释

Java可序列化 : – 可序列化来自标准的Java,并且实现起来更容易,所有你需要做的就是实现Serializable接口并添加重写两个方法。
Serializable的问题是,它试图适当地处理在阳光下的一切,并使用大量的reflection来确定正在序列化的types。 所以它变成了一个强壮的对象。

Android的Parcelable : – Android的进程间通信(AIPC)文件告诉Android应该如何编组和解组你的对象。它是不太通用的,不使用reflection,所以它应该有更less的开销,要快得多。

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

分包和序列化都是编组和解组数据的方式。 在android中这是用来传递组件和进程之间的非原始数据types。 一般来说,android允许可序列化或可分段的对象,所以你可以select你的方法。 AIDL接口的例外情况就是这样。 对象必须可以被传递/返回。

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

因此,这就是为什么包裹更快。 该对象不需要被反映来发现这些字段。 这是反映,它使缓慢。

序列化也具有内置的版本控制…如果您尝试解组到不同版本的对象的类被编组,该过程将以可预测的方式失败。 与parcel,你可以做同样的事情,但你需要自己实现它通过添加一个“版本字段到您的对象,代码,当unmarhsaling检查版本。

据说,我通常使用序列化。 与简单的对象,你不会注意到的差异。 如果您发现性能问题,则可以随时更改以在开发中稍后使用parcel。