美文网首页
数据序列化Parcelable&Serializable

数据序列化Parcelable&Serializable

作者: IT一书生 | 来源:发表于2018-03-26 20:03 被阅读12次

    概述

    • 序列化:将数据结构或对象转换成可用于存储或传输的数据格式的过程,在序列化期间,数据结构或对象将其状态信息写入到临时或持久性存储中;
    • 反序列化:将序列化生成 的数据还原成数据结构或对象的过程。

    性能比较

    对比 Parcelable Serializable
    实现方式 实现Parcelable接口 实现Serializable接口
    属于 android 专用 Java自带
    内存消耗 优秀 一般
    读写数据 内存中直接进行读写 通过使用IO流的形式将数据读写入在硬盘上
    持久化 不可以 可以
    速度 优秀 一般

    Serializable

    Serializable 是JDK提供的接口,序列化方式是基于磁盘或网络的。Serializable 接口是一种标识接口,也就是无需实现方法,便能实现序列化。
    缺点:使用反射机制,在序列化过程中产生很多临时文件,容易触发垃圾回收,序列化的过程比较慢。
    序列化过程中使用 serialVersionUID 的版本号和序列化的类关联,如果序列化和反序列化的UID不同,会报 InvalidClassException 异常;解决方式是显式指定 UID(IDE 为我们随机生成)。

    /** 
     * 直接实现 Serializable 接口完成序列化 
     */  
    public class ZpSerializableBean implements Serializable{  
      
        private static final long serialVersionUID = 9165010654231l;  
      
        private int id;  
        private String name;  
      
        public int getId() {  
            return id;  
        }  
     
        public void setId(int id) {  
            this.id = id;  
        }  
      
        public String getName() {  
            return name;  
        }  
      
        public void setName(String name) {  
            this.name = name;  
        }  
    }
    

    Parcelable

    Parcelable 是Android SDK 提供的,它是基于内存的,速度快;一般Android 中跨进程对象的传递 一般使用 Parcelable。
    缺点:需要生成大量的模板代码。可以使用Studio 的插件 Android Parcelable code generator ,一键生成模板代码

    public class ZpParcelableBean implements Parcelable {  
      
        private int id;  
        private String name;  
      
        public ZpParcelableBean() {  
        }  
          
        // 接口内容的描述,一般默认返回0  
        @Override  
        public int describeContents() {  
            return 0;  
        }  
      
        // 序列化的方法,将类的数据写入到 Parcel 容器中  
        @Override  
        public void writeToParcel(Parcel dest, int flags) {  
            dest.writeInt(this.id);  
            dest.writeString(this.name);  
        }  
      
        // Parcel内部包装了可序列化的数据,可以在Binder中自由传输。 从序列化后的对象中创建原始对象。 
        protected ZpParcelableBean(Parcel in) {  
            this.id = in.readInt();  
            this.name = in.readString();  
        }  
    
        // 反序列化功能是由CREATOR来完成,其内部标明了如何创建序列化对象和数组, 
        // 并通过Parcel的一些了read方法来完成反序列化过程。
        public static final Parcelable.Creator<ZpParcelableBean> CREATOR = new Parcelable.Creator<ZpParcelableBean>() {  
      
            // 反序列化方法,将 Parcel 还原成 Java 对象  
            @Override  
            public ZpParcelableBean createFromParcel(Parcel source) {  
                return new ZpParcelableBean(source);  
            }  
      
            // 提供给外部类反序列化这个数组使用  
            @Override  
            public ZpParcelableBean[] newArray(int size) {  
                return new ZpParcelableBean[size];  
            }  
        };  
      
        public int getId() {  
            return id;  
        }  
      
        public void setId(int id) {  
            this.id = id;  
        }  
      
        public String getName() {  
            return name;  
        }  
      
        public void setName(String name) {  
            this.name = name;  
        }  
    }  
    

    比较

    • Serializable用起来简单,但开销很大,序列化和反序列化过程都需要大量的I/O操作。
    • Parcelable是Android中的序列化方式,更适合在Android平台上使用,用起来比较麻烦,效率很高,首选。主要用在内存序列化上

    数据传递

    • Parcelable
        // 传递数据
        Bundle bundle = new Bundle();
        //Parcelable 系列化对象
        bundle.putSerializable("person_data",person);
        intent.putExtras(bundle);
        ---------------------------------------------------------
        // 获得数据
        Person person =(Person) getIntent().getParcelableExtra("person_data")
    
    • Serializable
        // 传递数据
        intent.putExtra("person_data",person);
        ---------------------------------------------------------
        // 获得数据
        Person person = (Person)getIntent().getSerializableExtra("person_data");
    

    相关文章

      网友评论

          本文标题:数据序列化Parcelable&Serializable

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