天天看点

Serializable和Parcelable

对象在传递过程中必须进行序列化方可传递,android序列化有两种方式,分别是继承Serializable和Parcelable接口。两种都是用于支持序列化、反序列化话操作,两者最大的区别在于存储媒介的不同,Serializable使用IO读写存储在硬盘上,而Parcelable是直接在内存中读写,很明显内存的读写速度通常大于IO读写,Serializable是java序列化接口,使用起来简单但是开销大序列化反序化都要进行大量的I/O操作,Parcelable是Android中的序列化方式,所以在Android中通常优先选择Parcelable。平日开发中Serializable比较容易上手直接继承接口即可,Parcelable使用较为复杂,但是性能高于Serializable十倍。

当对象序列化到存储设备或者通过网络传输的时候最好是使用Serializable,Parcelable也可以用做该过程,但是使用比较复杂所以建议使用Serializable。其他情况使用建议Parcelable

1、平台区别

  • Serializable是属于 Java 自带的,表示一个对象可以转换成可存储或者可传输的状态,序列化后的对象可以在网络上进行传输,也可以存储到本地。
  • Parcelable 是属于 Android 专用。不过不同于Serializable,Parcelable实现的原理是将一个完整的对象进行分解。而分解后的每一部分都是Intent所支持的数据类型。

2、编写上的区别

  • Serializable代码量少,写起来方便
  • Parcelable代码多一些,略复杂

3、选择的原则

  • 1、如果是仅仅在内存中使用,比如activity、service之间进行对象的传递,强烈推荐使用Parcelable,因为Parcelable比Serializable性能高很多。因为Serializable在序列化的时候会产生大量的临时变量, 从而引起频繁的GC。
  • 2、如果是持久化操作,推荐Serializable,虽然Serializable效率比较低,但是还是要选择它,因为在外界有变化的情况下,Parcelable不能很好的保存数据的持续性。

4、本质的区别

  • 1、Serializable的本质是使用了反射,序列化的过程比较慢,这种机制在序列化的时候会创建很多临时的对象,比引起频繁的GC、
  • 2、Parcelable方式的本质是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的类型,这样就实现了传递对象的功能了。

Seralizable介绍:

1.Serializable 是java的序列化技术,最简单的使用方式为在需要序列化的class增加implements Serializable,并增加一个唯一个序列化id: private static final long serialVersionUID = 1L; 默认方式最好直接设置为1L,因为java  sdk会自动进行hash计算,并生成唯一的UID值。手动设置serialVersionUID的好处是当前class如果改变了成员变量,比如增加或者删除之后,这个UID是不改变的,那么反序列化就不会失败;自动设置则在改变了成员变量之后就会重新计算获得新的UID,从而导致失败。不过,大多数情况下两者都可以。

2.Seralizable相对Parcelable而言,好处就是非常简单,只需对需要序列化的类class执行就可以,不需要手动去处理序列化和反序列化的过程,所以常常用于网络请求数据处理,Activity之间传递值的使用。

Activiyt之间传递如图:

Serializable和Parcelable
Serializable和Parcelable
Serializable和Parcelable

3.Seralizable无法序列化静态变量,使用transient修饰的对象也无法序列化。

4.当一个父类实现序列化,子类自动实现序列化,不需要再显示实现Serializable接口。

序列化原理(一):从源码理解Serializabl     https://www.jianshu.com/p/32d5219539a9

二、Parcelable介绍:

1.Parcelable是android特有的序列化API,它的出现是为了解决Serializable在序列化的过程中消耗资源严重的问题,但是因为本身使用需要手动处理序列化和反序列化过程,会与具体的代码绑定,使用较为繁琐,一般只获取内存数据的时候使用。

2.而Parcelable依赖于Parcel,Parcel的意思是包装,实现原理是在内存中建立一块共享数据块,序列化和反序列化均是操作这一块的数据,如此来实现。

Serializable和Parcelable

3.Parcelable的三个过程:序列化、反序列化和描述

序列化:

@Override
    public void writeToParcel(Parcel dest, int flags) {
 
    }
           

反序列化:

class User{
 
    }
 
    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel source) {
            return null;
        }
 
        @Override
        public User[] newArray(int size) {
            return new User[0];
        }
    };
           

描述:

@Override
    public int describeContents() {
        return 0;
    }
           

序列化的时候使用:writeXX

反序列化的时候使用:readXX

描述describecontents:

Serializable和Parcelable

一般情况下设置为0,特别的为

public static final int CONTENTS_FILE_DESCRIPTOR = 0x0001;
           

 这种是当要求为file descriptor(文件描述符)被序列化的情况。

序列化原理(二):从源码理解Parcelable     https://www.jianshu.com/p/c4f000fd2e82

Android Parcel对象详解      https://blog.csdn.net/rainbowchou/article/details/54294394           

Serializable和Parcelable区别    https://www.jianshu.com/p/2ed41bb7aa3a

Parcelable 和 Serializable的区别和使用  https://blog.csdn.net/hacker_crazy/article/details/80840868