Serializable
优点:
- 只需要实现Serializable接口,用起来简单,不需要多余的代码
- 能够将内容序列化到磁盘中
缺点:
- 效率低,占用内存多
使用中的关键点:
-
要主动给出一个serialVersionUID。序列化操作的时候系统会把当前类的serialVersionUID写入到序列化文件中,当反序列化时系统会去检测文件中的serialVersionUID,判断它是否与当前类的serialVersionUID一致,如果一致就说明序列化类的版本与当前类版本是一样的,可以反序列化成功。指定serialVersionUID,这样的话即使微小的变化也不会导致crash的出现。
-
关键字transient可以排除不需要序列化的字段
-
- 序列化时,首先系统会先调用writeReplace方法,在这个阶段,可以进行自己操作,将需要进行序列化的对象换成我们指定的对象.一般很少重写该方法
private Object writeReplace() throws ObjectStreamException { System.out.println("writeReplace invoked"); return this; }
- 接着系统将调用writeObject方,来将对象中的属性一个个进行序列,我们可以在这个方法中控制住哪些属性需要序列化.
private void writeObject(java.io.ObjectOutputStream out) throws IOException { System.out.println("writeObject invoked"); out.writeObject(this.name == null ? "zejian" : this.name); }
- 反序列化时,系统会调用readObject方法,将我们刚刚在writeObject方法序列化好的属性,反序列化回来.然后通过readResolve方法,我们也可以指定系统返回给我们特定的对象可以不是writeReplace序列化时的对象,可以指定其他对象.
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { System.out.println("readObject invoked"); this.name = (String) in.readObject(); System.out.println("got name:" + name); }
- 通过readResolve方法,我们也可以指定系统返回给我们特定的对象 可以不是writeReplace序列化时的对象,可以指定其他对象.一般很少重写该方法
private Object readResolve() throws ObjectStreamException { System.out.println("readResolve invoked"); return this; }
Parcelable
优点:
- 内存占用少,传输效率高
缺点:
- 需要编写额外的代码