何时以及如何实现Parcelable Vs.序列化?

时间:2016-09-15 18:44:59

标签: java android

在我的Java(Android)类中使用Serializable实现一段时间后,我发现了Parcelable,但我无法找到何时选择其中一个。 它们之间的性能差异是什么?

3 个答案:

答案 0 :(得分:10)

  

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

对于您使用ParcelableSerializable个附加内容,保存的实例状态Parcelable等等,

Intent明显快于Bundle

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

  

何时选择一个或另一个

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

这样做的一个主要例外是,如果您的Java对象位于可以从Android和其他Java环境中使用的单独库中。这些环境不会Parcelable,但Serializable可以在两个地方都有效。

答案 1 :(得分:3)

Parcelable协助在Android组件之间传递数据。 Binder将要发送的包裹编组,发送和接收,然后在另一侧解组,以重建原始包裹的副本。

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

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

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

小心点?

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

检查以下项目以避免手动编写Parcelable。

答案 2 :(得分:0)

Parcelable对于android更好: 1.它更快 2.它不使用反射(Serializable使用反射)