Android 技术之Serializable和Parcelable方式

来源:互联网 发布:mplayer 1.3 windows 编辑:程序博客网 时间:2024/06/05 08:52

Serializable和Parcelable方式

对于初学者来说,一般看到这两个方式都不知道是干嘛用的,我也是看了一些资料才看到学到的。(有空还是多学学吧,毕竟为了老婆本啊!)
首先大概说一下,相信很多人都知道Intent 在activity中传递对象的方式:

Intent intent = new Intent();        intent.setClass(MainActivity.this,twoActivty.class);        intent.putExtra("name","wang");        intent.putExtra("age",1);        startActivity(intent);

很简单吧!我们可以在intent 里面添加一些数据,达到传值的效果,然后我们只需要在需要用的activity中:

getInten().getStringExtra("name");getInten().getIntExtra("age");

但是你可很简单的看到,这个传值是有限制的,就是它支持的数据类型是有限的,如果你想要去传一些自定义对象的时候,呵呵呵!

这个时候你就可以用到Serializable和Parcelable方式了!!!!

(1)Serializable
字面上的意思就是序列化的意思,它可以将一个对象转化成 可以存储的或者可以传输的状态,然后你可以在网络上传输,也可以在本地上存储 ,它就是一个接口,你只需要在bean中implements Serializable(就这么简单)

public class Per implements Serializable{    private String user;    private int p;    public Per(String user, int p) {        this.user = user;        this.p = p;    }    public String getUser() {        return user;    }    public void setUser(String user) {        this.user = user;    }    public int getP() {        return p;    }    public void setP(int p) {        this.p = p;    }}

这样所有的Per对象都是可序列化了,其中get和set方法都是用骨赋值和读取字段数据的,然后我们在第一个activity中:

button = (Button) findViewById(R.id.sss);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent = new Intent(getApplicationContext(),twoActivty.class);                Per p= new Per("SS",54);                intent.putExtra("ss",p);                startActivity(intent);            }        });

接着,在你需要用到的activity中 :

Per p  = (Per) getIntent().getSerializableExtra("ss");        ss.setText(+"getUser:"+p.getUser()+"\n"+"getP:"+p.getP());

拿到Per后,然后向下转型成Per对象,p.getUser就是你想拿到的东西了!

(2)Parcelable

Parcelable实现的原理是将一个完整的对象进行分解,然后分解出来的每一部分就是Intent所支持的数据类型,这样就可以实现传递对象的功能了!直接上代码:

public class Stu implements Parcelable {    private String name;    private int age;    public Stu() {    }    public Stu(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;    }    @Override    public int describeContents() {        return 0;    }    @Override    public void writeToParcel(Parcel dest, int flags) {    dest.writeString(name); //写出name    dest.writeInt(age); //写出age    }    public static final Parcelable.Creator<Stu> CREATOR = new Parcelable.Creator<Stu>(){        @Override        public Stu[] newArray(int size) {            return new Stu[size];        }        @Override        public Stu createFromParcel(Parcel source) {            Stu s = new Stu();            s.name = source.readString(); //读取name            s.age = source.readInt(); // 读取age            return s;        }    };}

这时,你会发现好像好复杂,其实刚才我又写到,这是把他们分解,别总是觉得和Serializable对比起来多了好多行,然后就不去看一下代码怎么写到,如果你认真看一下就。。。。(哦哦哦)

其中需要注意一个地方就是字符串类型就要写成 writeString(),整形数据就是writeIntent()方法,以此类推
还有必须实现两个方法,describeContents和writeToParcel (看字面意思就知道什么意思了,除非你不懂英文,这我就没办法帮你了)
describeContents()直接返回0 就好了
最后,还必须在这个Stu中提供一个名为CREATOR 的常量 ,是固定的 ,
Parcelable.Creator接口的一个实现 ,然后泛型就是我们自定义的Stu ,newArray和createFromParcel这两个方法要记得重写。

最后,需要注意的地方就是
“getIntent().getParcelableExtra(“ss”);

其他都是一样的啦!!!!!!

总结一下吧,两个方式对比的话,前面的会比较简单,但是由于把整个对象都序列化了,效率一定比不过后者,所以你就可以根据你的需求选择一下实现吧!

谢谢!这是本人写的第三篇,写的不好,少喷啊!发现才会用这个编辑器,,哎哎哎啊!以后再加上图片和其他的!


0 0
原创粉丝点击