美文网首页
序列化serializable和parcelable区别

序列化serializable和parcelable区别

作者: goldenfire | 来源:发表于2017-12-07 15:15 被阅读8次

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

    1.优劣

    Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的

    Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。使用了反射,序列化的过程较慢

    serializable的迷人之处在于你只需要对某个类以及它的属性实现Serializable 接口即可。Serializable 接口是一种标识接口(marker interface),这意味着无需实现方法,Java便会对这个对象进行高效的序列化操作。

    Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。

    Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable在外界有变化的情况下,不能很好的保证数据的持续性。尽管Serializable效率低点,但此时还是建议使用Serializable 。

    Parcelable方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了

    Parcelable的持久化存储是不稳定的,它会随着系统版本的不同而变化

    2.使用

    对于Serializable,类只需要实现Serializable接口,并提供一个序列化版本id(serialVersionUID)即可

    Parcelable则需要实现writeToParcel、describeContents函数以及静态的CREATOR变量,实际上就是将如何打包和解包的工作自己来定义,而序列化的这些操作完全由底层实现

    例如:

    public class NewAddrIndia implements Parcelable {

    //tag = 1

    @SerializedName("addr")

    publicStringaddr;

    //tag = 2

    @SerializedName("landmark")

    publicStringlandmark;

    //tag = 3

    @SerializedName("city")

    publicStringcity;

    public static NewAddrIndia decode(byte[] bytes) throws IOException {

    BufferedSource source =newBuffer().write(bytes);

    ProtoReader reader =newProtoReader(source);

    returndecode(reader);

    }

    public static NewAddrIndia decode(ProtoReader reader)throwsIOException {

    NewAddrIndia result =newNewAddrIndia();

    longtoken = reader.beginMessage();

    for(inttag; (tag = reader.nextTag()) != -1; ) {

    switch(tag) {

    case1:

    result.addr= ProtoAdapter.STRING.decode(reader);

    break;

    case2:

    result.landmark= ProtoAdapter.STRING.decode(reader);

    break;

    case3:

    result.city= ProtoAdapter.STRING.decode(reader);

    break;

    default:

    reader.peekFieldEncoding().rawProtoAdapter().decode(reader);

    break;

    }

    }

    reader.endMessage(token);

    returnresult;

    }

    @Override

    public intdescribeContents() {

    return0;

    }

    @Override

    public void writeToParcel(Parcel dest,intflags) {

    dest.writeString(this.addr);

    dest.writeString(this.landmark);

    dest.writeString(this.city);

    }

    public NewAddrIndia() {

    }

    protected NewAddrIndia(Parcel in) {

    this.addr= in.readString();

    this.landmark= in.readString();

    this.city= in.readString();

    }

    public static final CreatorCREATOR=newCreator() {

    @Override

    public NewAddrIndia createFromParcel(Parcel source) {

    return newNewAddrIndia(source);

    }

    @Override

    public NewAddrIndia[] newArray(intsize) {

    return newNewAddrIndia[size];

    }

    };

    }

    相关文章

      网友评论

          本文标题:序列化serializable和parcelable区别

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