Android 开发中 Serializable 和 Parcelable 的使用和区别

2019/6/4 20:02:44 人评论 次浏览 分类:开发实例

1、 序列化的目的

(1)永久的保存对象,将对象数据保存在文件、磁盘或者数据库中 。

(2)通过序列化操作将对象数据在网络上进行传输 。

(3)将对象序列化之后在进程间进行传输 。

(4)在安卓中使用 Intent 进行传输时候,数据类型较为复杂的需要进行序列化操作 。

2、 Serializable

public class Mybox4 implements Serializable {
    private String name;
    private String age;

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

    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Mybox4{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}
复制代码

通过上述代码可以看出,使用 Serializable 的时候比较简单,只需要实现 Serializable 接口即可,这样就告诉程序这个类是可以被序列化的。

下面看下如何实现对象的序列化与反序列化:

Mybox4 mybox4 = new Mybox4("keven", "27");
File file = new File("box.out");

//序列化
FileOutputStream outputStream = new FileOutputStream(file);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(mybox4);
objectOutputStream.close();

//反序列化
FileInputStream fileInputStream = new FileInputStream(file);
ObjectInputStream inputStream = new ObjectInputStream(fileInputStream);
Mybox4 o = (Mybox4) inputStream.readObject();
inputStream.close();
System.out.println(o.toString());
复制代码

输出为:

Mybox4{name='keven', age='27'}
复制代码

3、 Parcelbale

Parcelable 是 Android 特有的序列化方式,他的实现相对 Serialiable 来说更加复杂一点。

Parcelable 内部包装了可序列化的数据,序列化功能由 writeToParcel 方法完成,反序列化由 CREATOR 完成。

public class Mybox4Par implements Parcelable {
    private String name;
    private String age;

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

    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Mybox4Par{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }

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

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

    public static final Parcelable.Creator<Mybox4Par> CREATOR=new Creator<Mybox4Par>() {
        @Override
        public Mybox4Par createFromParcel(Parcel source) {
            return new Mybox4Par(source);
        }

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

    public Mybox4Par(Parcel in){
        name=in.readString();
        age=in.readString();
    }
}
复制代码

上述就是实现了 Parcelable 接口,并重写方法,我们看下如何使用:

//第一个Activity

Mybox4Par mybox4Par=new Mybox4Par("keven","25");
Bundle bundle=new Bundle();
Intent intent=new Intent(this,MyViewActivity.class);
bundle.putParcelable("box",mybox4Par);
intent.putExtras(bundle);
startActivity(intent);
复制代码
//第二个Activity

Intent intent=getIntent();
Bundle extras = intent.getExtras();
Mybox4Par box = extras.getParcelable("box");
Log.e("box",box.toString());
复制代码

4、 两者选择

Serializable 使用简单但是开销很大,序列化与反序列化需要大量的 I/O 操作,一般用于将对象序列化到存储设备中,或序列化后通过网络传输;

Parcelable 使用稍微麻烦点,但是效率高,主要用在内存序列化上。

作者:Keven
链接:https://juejin.im/post/5cf0f7886fb9a07ed84228c5
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转载请注明:Android开发中文站 » Android 开发中 Serializable 和 Parcelable 的使用和区别

相关教程

  • Activity的四种启动模式-图文并茂

    1、对于使用standard 模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。例如A启动A,A再接着启动A,A继续启动A,然后再分别出栈,如图所示2、当活动的启动模式指定为 singleTop,在启动活动时如果发现返回栈的栈顶已经是该…

    2017/5/4 9:58:09

共有访客发表了评论 网友评论

验证码: 看不清楚?