欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android中Parcelable的使用

程序员文章站 2022-03-22 12:11:04
转载请标明出处 :https://www.cnblogs.com/tangZH/p/10998065.html Parcelable与Serializable Serializable是Java为我们提供的一个标准化的序列化接口。 Parcelable是Android为我们提供的序列化的接口。 对比 ......

转载请标明出处 :https://www.cnblogs.com/tangzh/p/10998065.html 

parcelable与serializable

serializable是java为我们提供的一个标准化的序列化接口。

parcelable是android为我们提供的序列化的接口。

 


 

对比:

1、parcelable相对于serializable的使用相对复杂一些。

2、parcelable的效率相对serializable也高很多。

3、parcelable不能使用在要将数据存储在磁盘上的情况,因为parcelable在外界有变化的情况下不能很好的保证数据的持续性。尽管serializable效率低点,但此时还是建议使用serializable。存储到设备或者网络传输上选择serializable。

 


 

序列化与反序列化

序列化:将对象转换为可以传输的二进制流(二进制序列)的过程,这样我们就可以通过序列化,转化为可以在网络传输或者保存到本地的流(序列),从而进行传输数据 。

反序列化:从二进制流(序列)转化为对象的过程。

 

简单使用:

进行android开发的时候,无法将对象的引用传给activities或者fragments,我们需要将这些对象放到一个intent或者bundle里面,然后再传递。简单看一下:

1、定义book类,实现parcelable接口。

 

package com.status.mattest;

import android.os.parcel;
import android.os.parcelable;

public class book implements parcelable {

    private string name;
    private int id;
    private string classify;

    protected book(parcel in) {
        name = in.readstring();
        classify = in.readstring();
        id = in.readint();
    }

    public book(string classify, string name, int id) {
        this.name = name;
        this.id = id;
        this.classify = classify;
    }

    /**
     * 反序列化
     */
    public static final creator<book> creator = new creator<book>() {
        @override
        public book createfromparcel(parcel in) {
            return new book(in);
        }

        @override
        public book[] newarray(int size) {
            return new book[size];
        }
    };

    @override
    public int describecontents() {
        return 0;
    }

    /**
     * 序列化过程
     *
     * @param dest
     * @param flags
     */
    @override
    public void writetoparcel(parcel dest, int flags) {
        dest.writestring(name);
        dest.writestring(classify);
        dest.writeint(id);
    }


    @override
    public string tostring() {
        return "name : " +
                name + "\"" + "id : " + id + "\"" + "classify" + classify;
    }
}

writetoparcel:序列化过程

creator与protected book(parcel in)配合实现反序列化,转换为对象。

 

注意:类中有多个string或者其它相同对象的话,那么writetoparcel中writestring的顺序是怎么样的,protected book(parcel in) {}中readstring的顺序就得是怎么样的。

 

2、mainactivity中:

textview.setonclicklistener(new view.onclicklistener() {
      @override
      public void onclick(view v) {
          intent intent = new intent(mainactivity.this, test1activity.class);
          intent.putextra("key", new book("哈", "鸿", 8));
          startactivity(intent);
      }
  });

 

3、另一个activity获取:

 intent intent = getintent();
 book book = intent.getparcelableextra("key");
 log.d("test1activity", book.tostring());

 

输出:

Android中Parcelable的使用

 


 

book类里面有其它对象:

如果book类里面有其他对象(比如实体类data)的话,那么data也需要实现parcelable接口,用法与上面的book类一样。

writetoparcel里面需要写上:dest.writeparcelable(data, 0);

protected book(parcel in) {}里面需要写上data = in.readparcelable(data.class.getclassloader());

 


 参考: