Android系统中Parcelable和Serializable的区别

进行Android开发的时候,我们都知道不能将对象的引用传给Activities或者Fragments,我们需要将这些对象放到一个Intent或者Bundle里面,然后再传递。

通过Android的API,我们知道有两种选择,即在传递对象时,需要对我们的对象进行 Parcelable 或者Serializable化。作为Java开发者,相信大家对Serializable 机制有一定了解,那为什么还需要 Parcelable呢?

为了回答这个问题,让我们分别来看看这两者的差异。

Serializable, 简单易用

 
 
  1. // access modifiers, accessors and constructors omitted for brevity
  2. public class SerializableDeveloper implements Serializable
  3.     String name;
  4.     int yearsOfExperience;
  5.     List<Skill> skillSet;
  6.     float favoriteFloat;
  7.  
  8.     static class Skill implements Serializable {
  9.         String name;
  10.         boolean programmingRelated;
  11.     }
  12. }

serializable的迷人之处在于你只需要对某个类以及它的属性实现Serializable 接口即可。Serializable 接口是一种标识接口(marker interface),这意味着无需实现方法,Java便会对这个对象进行高效的序列化操作。

这种方法的缺点是使用了反射,序列化的过程较慢。这种机制会在序列化的时候创建许多的临时对象,容易触发垃圾回收。

Parcelable, 速度至上

 
 
  1. // access modifiers, accessors and regular constructors ommited for brevity
  2. class ParcelableDeveloper implements Parcelable {
  3.     String name;
  4.     int yearsOfExperience;
  5.     List<Skill> skillSet;
  6.     float favoriteFloat;
  7.  
  8.     ParcelableDeveloper(Parcel in) {
  9.         this.name = in.readString();
  10.         this.yearsOfExperience = in.readInt();
  11.         this.skillSet = new ArrayList<Skill>();
  12.         in.readTypedList(skillSet, Skill.CREATOR);
  13.         this.favoriteFloat = in.readFloat();
  14.     }
  15.  
  16.     void writeToParcel(Parcel dest, int flags) {
  17.         dest.writeString(name);
  18.         dest.writeInt(yearsOfExperience);
  19.         dest.writeTypedList(skillSet);
  20.         dest.writeFloat(favoriteFloat);
  21.     }
  22.  
  23.     int describeContents() {
  24.         return 0;
  25.     }
  26.  
  27.  
  28.     static final Parcelable.Creator<ParcelableDeveloper> CREATOR
  29.             = new Parcelable.Creator<ParcelableDeveloper>() {
  30.  
  31.         ParcelableDeveloper createFromParcel(Parcel in) {
  32.             return new ParcelableDeveloper(in);
  33.         }
  34.  
  35.         ParcelableDeveloper[] newArray(int size) {
  36.             return new ParcelableDeveloper[size];
  37.         }
  38.     };
  39.  
  40.     static class Skill implements Parcelable {
  41.         String name;
  42.         boolean programmingRelated;
  43.  
  44.         Skill(Parcel in) {
  45.             this.name = in.readString();
  46.             this.programmingRelated = (in.readInt() == 1);
  47.         }
  48.  
  49.         @Override
  50.         void writeToParcel(Parcel dest, int flags) {
  51.             dest.writeString(name);
  52.             dest.writeInt(programmingRelated ? 1 : 0);
  53.         }
  54.  
  55.         static final Parcelable.Creator<Skill> CREATOR
  56.             = new Parcelable.Creator<Skill>() {
  57.  
  58.             Skill createFromParcel(Parcel in) {
  59.                 return new Skill(in);
  60.             }
  61.  
  62.             Skill[] newArray(int size) {
  63.                 return new Skill[size];
  64.             }
  65.         };
  66.  
  67.         @Override
  68.         int describeContents() {
  69.             return 0;
  70.         }
  71.     }
  72. }

根据 google 工程师的说法,这些代码将会运行地特别快。原因之一就是我们已经清楚地知道了序列化的过程,而不需要使用反射来推断。同时为了更快地进行序列化,对象的代码也需要高度优化。

因此,很明显实现Parcelable并不容易。实现Parcelable接口需要写大量的模板代码,这使得对象代码变得难以阅读和维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序邦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值