Android Serializable及Parcelable使用方法

为什么需要序列化

当我们需要在多个 Activity 之间传递对象时,我们不能直接传递对象的引用,我们应该对对象进行序列化,将对象转换成可传输的状态,然后放到 Intent 中进行传递。在 Android 中,我们可以通过 Serializable 和 Parcelable 来对对象进行序列化。

Serializable

Serailizable 是 Java 的一个接口,很容易实现,Java 在一定的条件下会自动帮我们去序列化对象,但是处理的方法相对较慢,会产生很多的临时变量,频繁的触发垃圾回收机制。

Parcelable

Parcelable 是 Android 特有的一个接口,它有丰富的方法在 Activitys 之间传递数据,当我们需要通过 Intent 在 Activitys 之间传递一个对象时,使用 Parcelabel 会比 Serializable 快很多(大约10倍左右),但实现该接口会相对于复杂一些,需要重写它的 describeContent() 和 writeToParcel(Parcel dest, int flags) 方法,并且需要注意读写顺序。

具体实现方法

通过 Serializable 方法,对 User 对象进行序列化,然后传递给 SecondActivity,以及通过 Parcelable 方法对 Article 对象进行序列化,然后传递给 ThirdActivity,效果如下:

Demo

首先对 model 进行序列化

通过实现 Serializable 接口,对 User 进行序列化。

public class User implements Serializable {
    private String name;
    private String age;
    private String hobby;

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

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

}
通过实现 Parcelable 接口,对 Article 进行序列化。

public class Article implements Parcelable {
    private String title;
    private String author;
    private String url;

    public Article() {

    }

    private Article(Parcel in) {
        title = in.readString();
        author = in.readString();
        url = in.readString();
    }

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

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

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(title);
        dest.writeString(author);
        dest.writeString(url);
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}

在 MainActivity 中,使用 Serializable 序列化 User 对象,然后传递给 SecondActivity,使用 Parcelable 序列化 Article 对象,然后传递给 ThirdActivity。

MainActivity.java

@Override
public void onClick(View v) {
    switch (v.getId()) {
    	// 
        case R.id.put_serializable:
            User user = new User();
            user.setName("JereChen");
            user.setAge("22");
            user.setHobby("playing basketball");

            Bundle bundle = new Bundle();
            bundle.putSerializable(PUT_SERIALIZABLE_USER_KEY, user);

            Intent serializableIntent = new Intent(MainActivity.this, SecondActivity.class);
            serializableIntent.putExtras(bundle);

            startActivity(serializableIntent);
            break;
        case R.id.put_parcelable:
            Article article = new Article();
            article.setTitle("Android 学习笔记");
            article.setAuthor("JereChen");
            article.setUrl("https://blog.csdn.net/jerechen");

            Bundle parcelableBundle = new Bundle();
            parcelableBundle.putParcelable(PUT_PARCELABLE_ARTICLE_KEY, article);

            Intent parcelableIntent = new Intent(MainActivity.this, ThirdActivity.class);
            parcelableIntent.putExtras(parcelableBundle);

            startActivity(parcelableIntent);
            break;
        default:
            break;
    }
}

在 SecondActivity 中,通过 getSerializable() 方法拿到 User 对象。

SecondActivity.java

TextView nameTv = findViewById(R.id.name_tv);
TextView ageTv = findViewById(R.id.age_tv);
TextView hobbyTv = findViewById(R.id.hobby_tv);

Intent serializableIntent = getIntent();
Bundle serializableBundle = serializableIntent.getExtras();
User user = null;
if (serializableBundle != null) {
    user = (User) serializableBundle.getSerializable(MainActivity.PUT_SERIALIZABLE_USER_KEY);
}
if (user != null) {
    nameTv.setText(user.getName());
    ageTv.setText(user.getAge());
    hobbyTv.setText(user.getHobby());
}

在 ThirdActivity 中,通过 getParcelable() 方法拿到 Article 对象。

ThirdActivity.java

TextView titleTv = findViewById(R.id.title_tv);
TextView authorTv = findViewById(R.id.author_tv);
TextView urlTv = findViewById(R.id.url_tv);

Intent parcelableIntent = getIntent();
Bundle parcelBundle = parcelableIntent.getExtras();
Article article = null;
if (parcelBundle != null) {
    article = parcelBundle.getParcelable(MainActivity.PUT_PARCELABLE_ARTICLE_KEY);
}
if (article != null) {
    titleTv.setText(article.getTitle());
    authorTv.setText(article.getAuthor());
    urlTv.setText(article.getUrl());
}

源代码:Android_Serializable_Parcelable_Learning

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值