对象序列化传递 Serializable 和Parcelable

来源:互联网 发布:java web service教程 编辑:程序博客网 时间:2024/04/23 15:07

序列化的概念,用于把一个对象转换为字节序列,然后再对这个字节序列做存储和传递操作,与之对应的是反序列化,反序列化是把一个字节序列恢复为Java对象的过程,而序列化是把Java对象转化为字节序列的过程。

  • Serializable

    1. Serializable序列化不保存静态变量,另外使用Transient关键字可声明对指定字段不做序列化。

    2.由于Serializable方式使用了反射机制,使得序列化的过程相对较慢。并且,这种机制会在序列化的时候创建许多的临时对象,容易触发垃圾回收。

    3.Serializable可将数据持久化方便保存,所以在需要保存文件或网络传输数据时应选择Serializable。

public class SData implements Serializable{    public int age;    public String name;    public Boolean sex;    public double height;}
  • Parcelable

    1.Parcelable数据仅在内存中存在,所以在内存间数据传输时推荐使用

    2.采用Parcelable方式的类,需要自己定义如何打包(写数据)和解包(读数据),其余的序列化操作则由底层实现。具体需要实现的方法如下:
    <1>writeToParcel(Parcel out, int flags) : 写数据
    <2>Parcelable.Creator<类名> CREATOR : 例行公事实现createFromParcel(读数据)和newArray
    <3>describeContents : 返回0即可

public class PDate implements Parcelable {    public int age;    public String name;    public Boolean sex;    public double height;    public static final Creator<PDate> CREATOR = new Creator<PDate>() {     // 读数据          @Override        public PDate createFromParcel(Parcel in) {            PDate pDate=new PDate();            pDate.age=in.readInt();            pDate.name=in.readString();            pDate.sex=in.readByte()!=0;            pDate.height=in.readDouble();            return pDate;        }        @Override        public PDate[] newArray(int size) {            return new PDate[size];        }    };    @Override    public int describeContents() {        return 0;    }    // 写数据    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeInt(age);        dest.writeString(name);        dest.writeDouble(height);        dest.writeByte((byte) (sex ? 1 : 0));    }}

Parcelable暂不支持直接操作布尔boolean类型,但能间接通过设置byte位来实现boolean类型的参数传递。

  • 下面是数据的传递代码

    MainActivity

public class MainActivity extends Activity implements View.OnClickListener {    public Button button1, button2;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        button1 = (Button) findViewById(R.id.SDate);        button2 = (Button) findViewById(R.id.PDate);        button1.setOnClickListener(this);        button2.setOnClickListener(this);    }    @Override    public void onClick(View v) {        int id = v.getId();        switch (id) {            case R.id.SDate:                SData sData = new SData();                sData.age = 22;                sData.name = "bingge";                sData.sex = true;                sData.height = 18.5;                Intent intent = new Intent(this, Serializable_Activity.class);                Bundle bundle = new Bundle();                bundle.putSerializable("people", sData);                intent.putExtras(bundle);                startActivity(intent);                break;            case R.id.PDate:                PDate pDate = new PDate();                pDate.age = 18;                pDate.name = "lihong";                pDate.sex = false;                pDate.height = 16.5;                Intent intent2 = new Intent(this, Pacelable_Activity.class);                Bundle bundle2 = new Bundle();                bundle2.putParcelable("hong", pDate);                intent2.putExtras(bundle2);                startActivity(intent2);                break;            default:        }    }}

Serializable_Activity接收数据

public class Serializable_Activity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.serializable_layout);        Bundle bundle = getIntent().getExtras();        SData sData = (SData) bundle.getSerializable("people");        String daye = sData.age + "";        String daye2 = sData.name;        String daye3 = sData.sex + "";        String daye4 = sData.height + "";        System.out.println("shuju:" + daye + daye2 + daye3 + daye4);    }}

Pacelable_Activity接收数据

public class Pacelable_Activity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.parcelable_layout);        Bundle bundle = getIntent().getExtras();        PDate pDate = bundle.getParcelable("hong");        String daye= pDate.age+"";        String daye2= pDate.name;        String daye3= pDate.sex+"";        String daye4= pDate.height+"";        System.out.println("shuju:"+daye+daye2+daye3+daye4);    }}
0 0