【问题标题】:When and how to implement Parcelable Vs. Serializable?何时以及如何实现 Parcelable Vs。可序列化?
【发布时间】:2017-01-23 21:39:35
【问题描述】:

在我的 Java (Android) 类中使用 Serializable 实现一段时间后,我发现了 Parcelable,但我不知道何时选择一个或另一个。 还有它们之间的性能差异是什么?

【问题讨论】:

标签: java android


【解决方案1】:

它们之间的性能差异是什么?

对于您使用Parcelable 的地方,ParcelableSerializable 快得多:Intent extras、保存的实例状态Bundle 等。

话虽如此,假设您没有做很多这样的事情,尤其是在紧密循环中,用户不太可能真正注意到差异。

何时选择一个或另一个

如果您正在进行 Android 开发,请选择 Parcelable 而不是 Serializable,其中 Parcelable 是一个选项。最多使用Serializable 进行数据持久化,尽管我会推荐其他序列化选项(例如,通过 Gson 的 JSON)。

如果您的 Java 对象位于一个单独的库中,该库既可用于 Android 也可用于其他 Java 环境,一个主要的例外情况是。这些环境不会有Parcelable,但Serializable 在这两个地方都可以工作。

【讨论】:

    【解决方案2】:

    Parcelable 有助于在 Android 组件之间传递数据。 Binder 对要发送的 Parcel 进行编组、发送和接收,然后在另一端对其进行解组以重建原始 Parcel 的副本。

    w.r.t Serializable 你只需要在一个类及其子类上实现 Serializable 接口。它是一个标记接口,意味着没有可实现的方法,Java 将尽最大努力高效地对其进行序列化。它使用反射往往会创建大量临时对象并导致相当多的垃圾回收。

    根据谷歌工程师的说法,Parcelable 比 Serializable 快 10 倍以上。在 Parcelable 中,开发人员编写用于编组和解组的自定义代码,因此与序列化相比,它创建的垃圾对象更少。

    您可以在此处查看示例代码以了解实现差异-Android: Difference between Parcelable and Serializable?

    小心点?

    • 关注的是你写和读你的顺序 传入和传出 Parcel 的值。Android 用于读取的机制 包裹是盲目的,完全相信你会得到订单 正确,否则您将遇到运行时崩溃。
    • 没有 将布尔值写入包裹的简单方法。为此,您可以改为 用 out.writeByte((byte) 写入一个具有相应值的字节 (myBoolean ? 1 : 0));并用 myBoolean = 类似地检索它 in.readByte() != 0;

    勾选以下项目,避免手动编写 Parcelable。

    【讨论】:

      【解决方案3】:

      Parcelable 更适合安卓: 1.速度更快 2.不使用反射(Serializable使用Reflection)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-25
        • 2011-08-19
        相关资源
        最近更新 更多