一、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) {Parcel内部包装了可序列化的数据,可以在Binder中自由传输。从上面的代码中我们可以看出,在序列化过程中需要实现的功能有序列化、反序列化和内容描述。序列化功能是由writeToParcel方法来完成,最终是通过Parcel中的一系列write方法来完成的。反序列化是由CREATOR来完成,其内部标明了如何创建序列化对象和数组,并通过Parcel的一系列read方法来完成反序列化过程;内部描述功能由describeContents方法来完成,几乎所有的情况下这个方法都应该返回0,仅当当前对象中存在文件描述符时,此方法返回1。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) { }}
三、区别
Serializable是Java中的序列化接口,使用起来简单但是开销很大,序列化和反序列化过程需要大量I/O操作。
Parcelable是Android中的序列化方式,因此更适合在Android平台上,缺点是使用起来稍微麻烦一点,但其胜在效率高,这是Android推荐的序列化方式,因此我们首选Parcelable。但是如果要将对象序列化到存储设备中,或者将对象序列化后通过网络传输,此种情况下则推荐使用Serializable ,因为这种情况下的序列化过程或比较复杂。