3

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

 3 years ago
source link: http://www.androidchina.net/9921.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Android 开发中 Serializable 和 Parcelable 的使用和区别 – Android开发中文站
你的位置:Android开发中文站 > Android开发 > 新手入门 > Android 开发中 Serializable 和 Parcelable 的使用和区别

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
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK