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

时间:2012-06-18 06:32:52

标签: android serializable parcelable

我想知道确切的,

  1. 我应该使用parcelable还是serialization技术 用于将数据从一个活动发送到其他活动吗?
  2. 是强制性的 使用其中一个将数据从一个发送到另一个?
  3. 我什么时候应该使用它们?
  4. 以及它们与性能之间的确切差异 他们两个在java方面。
  5. 提前致谢。


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

5 个答案:

答案 0 :(得分:26)

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

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

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

将非基元类型转换为基元并通过某种通信通道发送到其他应用程序的过程称为序列化。反向过程称为De Serialization。

在Java中,IPC严重依赖Serializables进行序列化。但序列化的设计考虑了桌面应用程序。当您在移动应用程序中进行IPC时,我们必须确保IPC的过程不会太重。

简单来说,序列化对于IPC来说是一个沉重的概念。 因此,取代Serialization,Android选择了Binders来实现轻量级的进程间通信。内部粘合剂在很大程度上依赖于包裹来进行IPC。 包裹是轻质可序列化的。最好使用parcel将对象封送到字节流中。

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

答案 1 :(得分:19)

  

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

如果您要通过intent向另一项活动发送非基本类型的数据/对象,则必须Serialize或为该对象实施Parcelable。首选技术是Parcelable,因为它不会影响性能。

  

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

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

  

以及它们与java方面的性能之间的确切差异。

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

答案 2 :(得分:5)

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

虽然从很长一段时间开始,你的问题可能会有所帮助:

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

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

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

Ans:是的,因为将数据(对象)从一个发送到另一个需要写入和检索字节流,并且可以通过parcelable或serialization来完成。

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

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

  
      
  1. 以及它们与java方面的性能之间的确切差异。
  2.   

答案:1。Android SDK中详细记录了Parcelable;另一方面,序列化可以在Java中找到。

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

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

  3. 答案取自: this link

    另请参阅:serialization explained

答案 3 :(得分:3)

Java Serializable : - Serializable来自标准Java并且更容易实现您需要做的就是实现Serializable接口并添加override两个方法。
Serializable 的问题在于它试图适当地处理太阳下的所有事情并使用大量反射来确定被序列化的类型。所以它变成了一个强大的对象。

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

http://www.3pillarglobal.com/blog/parcelable-vs-java-serialization-android-app-development

了解详情

答案 4 :(得分:2)

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

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

因此,这就是为什么parceling更快。不需要反映对象来发现字段。这是使它变慢的反射。

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

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