Parcelable和Serializable的区别

来源:互联网 发布:外贸原单包包淘宝 编辑:程序博客网 时间:2024/05/22 05:26

Serializable接口:
1、采用流的方式对对象进行序列化和反序列化,反序列化之后的对象和
序列化之前的对象内容相同,但是两者并不是一个对象

2、需要注意serializableUID,如果不声明此变量会对反序列化产生影响
程序在序列化的时候会把当前类的serializableUID写入序列化的文件中
,当反序列化的时候回去检测文件的serializableUID,看和类中的值是否一样
,如果一样,说明序列化的版本和当前类的版本是相同的这个时候可以反序列化成功的
否则,则说明当前类和序列化的类发生了改变,比如成员变量的数量类型等可能发生改变
这个时候是无法正常反序列化的,汇报如下异常:
java.io.InvalidClassException:
当手动指定了UID之后,如果删除或者增加了某些变量,反序列化仍然能够完成,
反之,如果不指定UID程序则会挂掉,但是如果类结构发生了非常规性改变,
比如修改了类名,修改了成员变量的类型,尽管UID验证通过了,反序列化还是会失败,因为类结构有了毁灭性的改变
根本无法从老版本的数据中还原出一个新的类结构的对象

Parcelable接口:

package com.sjq.aidlservice;import android.os.Parcel;import android.os.Parcelable;/** * Created by cs001 on 2016/6/28. */public class Persion implements Parcelable {    private String name;    private int age;    private String adrs;    private Book book;        public Persion(String name,int age,Strin adrs{            this.name = name;            this.age = age;            this.adrs = adrs;        }    /**    * 由于Book是另外一个可序列化对象,所以它的反序列化需要传递当前线  程的上下文类加载器     * 否则会报类无法找到的异常     * @param in     */    protected Persion(Parcel in) {        this.name = in.readString();        this.age = in.readInt();        this.adrs = in.readString();        this.book = in.readParceable(Thread.currentThread().getContextClassLoader());    }    /**     * @param dest  Parcel 内部封装了可序列化的数据,可以在Binder中自由传输     * @param flags 0或者1 为1时,当前对象需要作为返回值返回,不能立即释放资源,几乎所有情况都为0     *              对象的序列化工作主要由此函数完成     */    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeString(name);        dest.writeInt(age);        dest.writeString(adrs);        dest.writeParceable(book,0);    }    /**     * 内容描述功能由此函数功能,仅当当前对象中存在文件描述符时返回1,     * 几乎所有情况下都返回0     */    @Override    public int describeContents() {        return 0;    }    /**     * 反序列化工作主要由CREATOR完成     */    public static final Creator<Persion> CREATOR = new Creator<Persion>() {        @Override        public Persion createFromParcel(Parcel in) {            return new Persion(in);        }        @Override        public Persion[] newArray(int size) {            return new Persion[size];        }    };}

系统已经为我们提供了许多实现Parcelable接口的类:Intent,Bundle,Bitmap,List和Map

总结

Paecelable和Serializable的区别:

1、Serializable是Java的序列化接口,其实用起来简单但是开销很大
系列化和反序列化都需要大量的I/O操作
2、Parcelable是Android的序列化方式,适合使用在Android平台上,缺点是使用麻烦
但是效率很高,这是Android推荐的序列化方式,主要用在内存序列化上
3、使用Parcelable将对象序列化到存储设备或者将对象序列化后通过网络传输
会比较复杂,因此这两种情况推荐使用Serializable

0 0
原创粉丝点击