Android中对象的序列化

2021-09-22  本文已影响0人  KevinGarnett21

对象的序列化

1. 概述

搞Android的小伙伴我估计大家都用过对象的序列化,因为在我们使用Intent或者Binder传输对象数据以及SharedPreferences存储对象数据时,都需要将我们的实体类对象序列化,实现的方式很简单,实现Serializable或者Parcelable两种方式,接下来就简介的介绍一下这两种方式以及优劣势。

2. Serializable接口

public class Person implements Serializable {

    // 类型声明
    private static final long serialVersionUID = 1L;

    private String name;

    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

疑问:GreenDao数据库实现Serializable的接口必须得提供一个声明,为什么

不手动指定serialVersionUID的值.反序列化时,当实体类有所改变,
比如增加或者删除了某些成员变量,此时当前类的serialVersionUID和之前序列化的serialVersionUID不一致,就会导致程序挂掉。
但是如果类发生了毁灭性的非常规性改变时,反序列化过程还是会失败,无法从老版本数据还原。这就是GreenDao在实现Serializable接口时必须提供一个声明。

3. Parcelable接口

public class Person implements Parcelable {

    public String name;

    public int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    protected Person(Parcel in) {
        name = in.readString();
        age = in.readInt();
    }

    public static final Creator<Person> CREATOR = new Creator<Person>() {
        @Override
        public Person createFromParcel(Parcel in) {
            return new Person(in);
        }

        @Override
        public Person[] newArray(int size) {
            return new Person[size];
        }
    };

    // 仅当前对象中存在文件描述符时,此方法返回
    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
    }
}

4. 两者的区别

上一篇 下一篇

猜你喜欢

热点阅读