android中使用的Parcelable和Serialization有啥区别

Posted

技术标签:

【中文标题】android中使用的Parcelable和Serialization有啥区别【英文标题】:what is difference between Parcelable and Serialization used in androidandroid中使用的Parcelable和Serialization有什么区别 【发布时间】:2012-06-20 03:08:54 【问题描述】:

我想知道确切的,

    我应该使用parcelable还是serialization技术 用于将数据从一个活动发送到另一个活动? 是否必须 使用其中之一将数据从一个发送到另一个? 什么时候应该使用它们? 以及它们和性能之间的确切区别 他们都在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;
    

【问题讨论】:

你经历过这些 - ***.com/questions/3323074/… 和 ***.com/questions/5550670/… 吗? 使用大写字母开始类名(GetSetClassGetsetclass)。 android 中的对象序列化需要什么?如果不序列化对象,我们可以不执行任务吗? 【参考方案1】:

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

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

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

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

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

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

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

【讨论】:

我不知道为什么这个答案直到现在还没有得到任何支持,它非常​​完整,老实说,对我来说是最好的答案之一。 @vsvankhede 好吧,似乎所有事情都有时间和地点,目前它是最受好评的。【参考方案2】:

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

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

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

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

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

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

【讨论】:

@hi arun George ,..为什么我应该只对非原始数据类型使用序列化?为什么它只对非原始数据类型是强制性的? 原始数据类型可以使用intent.putExtras(String id, PRIMITIVE_DATA_TYPE)从一个活动传递到另一个活动,并使用该类型的等效getMethod()在另一个活动中访问。但用户定义的数据类型并非如此,因此您必须使用serializationParcelable 好的,感谢您又回答了一个问题。如果我们使用序列化进行发送,我们什么时候应该使用 Bundle 发送数据以及需要将对象放入 Bundle intent.putExtras(String id, PRIMITIVE_DATA_TYPE) 中数据..【参考方案3】:

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

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

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

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

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

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

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

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

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

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

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

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

答案来自: this link

另见:serialization explained

【讨论】:

【参考方案4】:

Java 可序列化:- Serializable 来自标准 Java,实现起来要容易得多,您需要做的就是实现 Serializable 接口并添加覆盖两个方法。 Serializable 的问题 在于它试图适当地处理所有事情,并使用大量反射来确定正在被序列化的类型。所以它变成了一个强大的对象。Androids Parcelable:- Android 进程间通信 (AIPC) 文件,用于告诉 Android 应如何编组和解组您的对象。它不那么通用,不使用反射,因此它应该有更少的开销和更快的速度。

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

【讨论】:

强调序列化问题给了我的答案我的+1【参考方案5】:

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

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

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

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

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

【讨论】:

以上是关于android中使用的Parcelable和Serialization有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

Android Parcelable 和 Serializable

从 Android 中的对象实现 Serializable 和 Parcelable 接口 - 冲突

Android Parcelable和Serializable的区别

Android Parcelable和Serializable的区别

Android 使用 setonclickfillinintent 发送 Parcelable

Android系统中Parcelable和Serializable的区别