美文网首页基础Android知识Android开发
Serializable 和 Parcelable 区别

Serializable 和 Parcelable 区别

作者: 唠嗑008 | 来源:发表于2017-03-24 11:19 被阅读92次
    一、简介:

    android 中自定义的对象序列化的问题有两个选择一个是Parcelable,另外一个是Serializable。

    序列化原因:
    1.永久性保存对象,保存对象的字节序列到本地文件中;
    2.通过序列化对象在网络中传递对象;
    3.通过序列化在进程间传递对象。

    二、序列化、反序列化是什么?
    (1) 名词解释
    对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程。对象的反序列化:把字节序列恢复为Java对象的过程。

    (2) 序列化详细解释
    对象的序列化涉及三个点关键点:Java对象、字节序列、存储。

    1. Java对象的组成?Java对象包含变量与方法。但是序列与反序列化仅处理Java变量而不处理方法,序列与反序列化仅对数据进行处理。

    2. 什么是字符序列?字符序列是两个词,字符是在计算机和电信领域中,字符(Character)是一个信息单位。数学上,序列是被排成一列的对象(或事件)。《字符-维基百科》 , 《序列-维基百科》 说白了就是连续排列的多个字符的集合。类似于1A165613246546

    3. 存储字符序列需要保存到一个地方,可以是硬盘也可以是内存。简单说法是:序列化把当前对象信息保存下来。反序列化刚好相反的操作。

    三、Java对象与Java对象序列化的区别?

    Java对象存在的前提必须在JVM运行期间存在,如果想在JVM非运行的情况下或者在其他机器JVM上获取指定Java对象,在现有Java对象的机制下都不可能完成。

    与Java对象不同的是,如果对Java对象执行序列化操作,因为原理是把Java对象信息保存到存储媒介,所以可以在以上Java对象不可能存在的两种情况下依然可以使用Java对象。

    四、为什么要使用序列化、反序列化?
    根据以上对序列化、反序列化的理解,这个疑问可以翻译成,为什么需要把对象信息保存到存储媒介中并之后读取出来?

    因为开发中有在JVM非运行的情况下或者在其他机器JVM上获取指定Java对象的需求。

    五、Android中Serializable与Parcelable区别?

    1、两种都是用于支持序列化、反序列化话操作,两者最大的区别在于存储媒介的不同,Serializable使用IO读写存储在硬盘上,而Parcelable是直接在内存中读写,很明显内存的读写速度通常大于IO读写,所以在Android中通常优先选择Parcelable。

    2、至于选取哪种可参考下面的原则:
    1.)在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。

    2.)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。

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

    六、实现:
    1、 Serializable 的实现,只需要继承 implements Serializable 即可。这只是给对象打了一个标记,系统会自动将其序列化。

    2、 Parcelabel 的实现,需要在类中添加一个静态成员变量 CREATOR,这个变量需要继承 Parcelable.Creator 接口。

    public class MyParcelable implements Parcelable {
         private int mData;
    
         public int describeContents() {
             return 0;
         }
    
         public void writeToParcel(Parcel out, int flags) {
             out.writeInt(mData);
         }
    
         public static final Parcelable.Creator<MyParcelable> CREATOR
                 = new Parcelable.Creator<MyParcelable>() {
             public MyParcelable createFromParcel(Parcel in) {
                 return new MyParcelable(in);
             }
    
             public MyParcelable[] newArray(int size) {
                 return new MyParcelable[size];
             }
         };
    

    相关文章

      网友评论

        本文标题:Serializable 和 Parcelable 区别

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