Serializable与Parcelable的使用方法及区别

一、Serializable接口

Serializable接口是Java所提供的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化操作。使用Serializable来实现序列化相当简单,只需要让该类实现Serializable接口,并在该类的声明中制定一个标识即可自动实现默认的序列化过程。例如:

public static final long serialVersionUID = 8711368828010083044L;
实际上,这个serialVersionUID也不是必须的,就实现序列化这个功能而言并无影响,但是会对反序列化产生一定的影响。下面举一个例子,Person类实现了Serializable接口,即可进行序列化和反序列化。如下所示:
public class Person implements Serializable {
    public static final long serialVersionUID = 8711368828010083044L;
    public int personId;
    public String personName;
    public boolean isMale;


        public Person(int personId, String personName,boolean isMale ) {
            this.isMale = isMale;
            this.personId = personId;
            this.personName = personName;
        }
}

 
 通过Serializable方式实现对象的序列化,实现起来非常简单,因为这种方法几乎所有的工作都被系统自动完成了。 

该对象的序列化和反序列化分别如下所示:

//对象的序列化
Person person = new Person(0,"jack",true);
try {
    ObjectOutputStream outputStream = new ObjectOutputStream(
            new FileOutputStream("cache.txt"));
    outputStream.writeObject(person);
    outputStream.close();
} catch (IOException e) {
    e.printStackTrace();
}

//对象的反序列化
try {
    ObjectInputStream inputStream = new ObjectInputStream(
            new FileInputStream("cache.txt"));
    Person newPerson = (Person)inputStream.readObject();
    inputStream.close();
} catch (IOException e) {
    e.printStackTrace();
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

二、Parcelable接口

只要实现了Parcelable接口,一个类的对象就可以实现序列化并可以通过Intent和Binder传递。下面通过一个例子来讲解Parcelable接口的序列化和反序列化:

public class User implements Parcelable {
    private int userId;
    private String userName;
    private boolean isMale;

    protected User(Parcel in) {
          userId = in.readInt();
          userName = in.readString();
          isMale = in.readInt() == 1;
} public User(boolean isMale, int userId, String userName) { this.isMale = isMale; this.userId = userId; this.userName = userName; } //反序列化 public static final Creator<User> CREATOR = new Creator<User>() { //从序列化后的对象中创建原始对象 @Override public User createFromParcel(Parcel in) { return new User(in); } //创建指定长度的原始对象数组 @Override public User[] newArray(int size) { return new User[size]; } }; //内容描述 @Override public int describeContents() { return 0; } //将当前对象写入到序列化结构中 @Override public void writeToParcel(Parcel parcel, int i) { }}
Parcel内部包装了可序列化的数据,可以在Binder中自由传输。从上面的代码中我们可以看出,在序列化过程中需要实现的功能有序列化、反序列化和内容描述。序列化功能是由writeToParcel方法来完成,最终是通过Parcel中的一系列write方法来完成的。反序列化是由CREATOR来完成,其内部标明了如何创建序列化对象和数组,并通过Parcel的一系列read方法来完成反序列化过程;内部描述功能由describeContents方法来完成,几乎所有的情况下这个方法都应该返回0,仅当当前对象中存在文件描述符时,此方法返回1。

三、区别

Serializable是Java中的序列化接口,使用起来简单但是开销很大,序列化和反序列化过程需要大量I/O操作。

Parcelable是Android中的序列化方式,因此更适合在Android平台上,缺点是使用起来稍微麻烦一点,但其胜在效率高,这是Android推荐的序列化方式,因此我们首选Parcelable。但是如果要将对象序列化到存储设备中,或者将对象序列化后通过网络传输,此种情况下则推荐使用Serializable ,因为这种情况下的序列化过程或比较复杂。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值