Parcelable和Serializable的理解

来源:互联网 发布:青岛淘宝培训班 编辑:程序博客网 时间:2024/06/06 12:29

很少在博客上敲文本了,都是直接上代码就结束了,今天抽点时间写点东西。
我们知道在一般情况下,在两个或者多个Activity中传递数据中通过Intent的函数只能传递基本数据类型,那当我们想传输复杂的类的数据类型时候,我们就必须用到Parcelable或者Serializable接口经行传递数据。
Parcelable和Serializable都是能对数据经行序列化,将数据转化成字节流的方式进行传输,当这些字节流传输完毕后再对其进行反序列化,达到传输复杂数据的目的。
Serializable接口是原先Java Se中就存在的Api,但是在google公司在Android中又添加了Parcelable接口,为什么呢?第一,Parcelable比Serializable的传输速率要快很多倍,大概十倍左右(具体不知道),所以实现Parcelable接口可能提高程序的性能。第二,Parcelable可以进行IPC通讯,即跨进程通讯,这是Serializable做不到的。还有一些优点大家可以摸索,我就不累述了。
不说了,上代码

package com.example.administrator.test;import android.os.Parcel;import android.os.Parcelable;/** * Created by hd on 2015/12/16. */public class Student implements Parcelable {    private String name;    private int age;    private String address;    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;    }    public String getAddress() {        return address;    }    public void setAddress(String address) {        this.address = address;    }    public static final Creator<Student> CREATOR = new Creator<Student>() {        @Override        public Student createFromParcel(Parcel in) {            Student a = new Student();            a.setName(in.readString());            a.setAddress(in.readString());            a.setAge(in.readInt());            return  a;        }        @Override        public Student[] newArray(int size) {            return new Student[0];        }    };    @Override    public int describeContents() {        return 0;    }    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeString(name);        dest.writeString(address);        dest.writeInt(age);    }    @Override    public String toString() {        return "name:" + name + "\n" +                "address:" + address + "\n" +                "age:" + age;    }}

可以看到,在这个bean中我实现了Parcelable接口,我们需要实现一些接口中的方法:

 public int describeContents();

对接口的描述,可以直接return 0;

public void writeToParcel(Parcel dest, int flags);

这个方法提供一个Parcel对象,在传递中就是通过将数据保存在这个对象中进行传递,所以我们要对这个Parcel进行写入数据的操作。至于flag参数只是作为一个标记,你可以在添加在数据中传递。

/**     * 此接口必须被实现,并且需要写成public权限以及对象名为CREATOR(必须大写)     */ public interface Creator<T> {        public T createFromParcel(Parcel source);        public T[] newArray(int size);    }

这是一个Parcelable内部的一个接口, 其中createFromParcel就是从Parcel中反序列化数据。

注意:
// 1.必须实现Parcelable.Creator接口,否则在获取Person数据的时候,会报错,如下:
// android.os.BadParcelableException:
// Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.um.demo.Person
// 2.这个接口实现了从Percel容器读取Person数据,并返回Person对象给逻辑层使用
// 3.实现Parcelable.Creator接口对象名必须为CREATOR,不如同样会报错上面所提到的错;
// 4.在读取Parcel容器里的数据事,必须按成员变量声明的顺序读取数据,不然会出现获取数据出错
// 5.反序列化对象

package com.example.administrator.test;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class MainActivity extends AppCompatActivity {    private Button btnSend;    private Button btnSeriaSend;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        btnSend = (Button) findViewById(R.id.btnSend);        btnSend.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent = new Intent();                Student a = new Student();                a.setName("小明");                a.setAddress("福建");                a.setAge(25);                intent.setFlags(0);                intent.setClass(MainActivity.this, SecondActivity.class);                intent.putExtra("hd", a);                startActivity(intent);            }        });        btnSeriaSend = (Button) findViewById(R.id.btnSeriaSend);        btnSeriaSend.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent = new Intent();                Teacher t = new Teacher();                intent.setFlags(1);                t.setName("小红");                t.setAddress("浙江");                t.setAge(24);                intent.putExtra("hd", t);                intent.setClass(MainActivity.this, SecondActivity.class);                startActivity(intent);            }        });    }}
package com.example.administrator.test;import java.io.Serializable;/** * Created by hd on 2015/12/16. */public class Teacher implements Serializable {    private String name;    private String address;    private int age;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getAddress() {        return address;    }    public void setAddress(String address) {        this.address = address;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    @Override    public String toString() {        return "name:" + name + "\n" +                "address:" + address + "\n" +                "age:" + age;    }}

这是Serializable的序列化,很简单,直接实现接口就行,但是不推荐噢。

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.administrator.test.MainActivity">    <TextView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/tvTest"/></RelativeLayout>
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 房东赶租客走怎么办 南京合租一间怎么办租房补贴 大学登错成绩怎么办 网游停服花了钱怎么办 北斗星x5油耗高怎么办 北斗星空调不凉怎么办 踏板摩托车费油怎么办 lol队友一直送怎么办 电脑信号无连接怎么办 电脑屏不全屏怎么办 电脑桌面不能显示全屏怎么办? 电脑黑屏无信号怎么办 笔记本电脑屏幕不显示怎么办 手机登录认证要怎么办 360手机丢失了怎么办 主播周年庆怎么办 学校选课系统进不去怎么办 选课系统关闭了怎么办 政府工作人员被威胁怎么办 报志愿忘记用户名怎么办 账号密码忘记了怎么办 商盟卡过期了怎么办 香港身份证掉了怎么办 简易注销有异议怎么办 左转红灯直行了怎么办 怀孕初期吃螃蟹怎么办 天下霸图打不过传闻怎么办 怀孕后期阴部痛怎么办 胎儿头大腿短怎么办 孕期大腿根疼怎么办 到工作单位催债怎么办 被讨债公司骚扰怎么办 要债人上门不走怎么办 阴阳师体力满了怎么办 狗吃了糯米怎么办 误给狗狗吃糯米怎么办 脸上长满了斑怎么办 突然满脸爆斑怎么办 熬夜脸上长斑怎么办 婴儿好感冒咳嗽怎么办 脸上长黄褐斑点怎么办