Android 高级进阶- 数据序列化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zp0119/article/details/79093405

前言:

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

反序列化:将序列化生成 的数据还原成数据结构或对象的过程。

一、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);
    }

    protected ZpParcelableBean(Parcel in) {
        this.id = in.readInt();
        this.name = in.readString();
    }

    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;
    }
}


猜你喜欢

转载自blog.csdn.net/zp0119/article/details/79093405
今日推荐