美文网首页Android开发学习
Serializable 和Parcelable

Serializable 和Parcelable

作者: feifei_fly | 来源:发表于2018-06-22 15:10 被阅读33次
    Serializable

    Serializable 是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。

    • Serializable 是java自带的,Parcelable 是Android特有的
    • Serializable 使用了反射,序列化的过程较慢,并且在序列化时 会产生大量的临时变量,有可能引发频繁的GC。这是Serializable的缺点。

    实现 Serializable 只需要声明实现Serializable接口,并声明一个serialVersionUID。

    public class Person implements Serializable{
        private static final long serialVersionUID = 7382351359868556980L;
        private String name;
        private int age;
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    
    
    Parcelable

    Parcelable 是Android中所特有的,也可以实现在网络上进行传输,也可以存储到本地的功能。

    • 不过不同于将对象进行序列化,Parcelable是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,从而实现传递对象的功能。在效率上Parcelable要比Serializable 快10倍以上。
    • 针对android的不同版本,Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化。

    实现Parcelable接口需要

    (1)复写describeContents方法和writeToParcel方法

    (2)实例化静态内部对象CREATOR,实现接口Parcelable.Creator。

    (3)writeToParcel写的顺序和CREATOR中读的顺序必须一致。

    public class Pen implements Parcelable{
        private String color;
        private int size;
        protected Pen(Parcel in) {
            color = in.readString();
            size = in.readInt();
        }
        public static final Creator<Pen> CREATOR = new Creator<Pen>() {
            @Override
            public Pen createFromParcel(Parcel in) {
                return new Pen(in);
            }
            @Override
            public Pen[] newArray(int size) {
                return new Pen[size];
            }
        };
        @Override
        public int describeContents() {
            return 0;
        }
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(color);
            dest.writeInt(size);
        }
    }
    
    作者:阿敏其人
    链接:https://www.jianshu.com/p/a60b609ec7e7
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
    

    应用场景:

    • 如果是保存或网络传输数据,尽管Serializable效率低点,但是还是推荐使用Serializable。
    • 如果是在内存中数据传输时推荐使用Parcelable,如activity间传输数据,AIDL进程间通信传递数据。因为Parcelable内存操作效率比较高。

    相关文章

      网友评论

        本文标题:Serializable 和Parcelable

        本文链接:https://www.haomeiwen.com/subject/ixvkyftx.html