Android 之 Parcelable 序列化

本文详细介绍了Android中Parcelable接口的功能和优势,对比Serializable接口,并提供了具体的实现步骤与案例,帮助开发者更好地掌握数据序列化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


/* 序列化
*
* 作用:序列化是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),
* 并且可以把保存的对象状态再读出来。即:序列化是一种能比较好的保存对象状态
* 的机制;
*
* 优点:
* 1、永久性的保存对象,保存对象的字节序列到本地文件中;
* 2、通过序列化对象在网络中传递对象;
* 3、通过序列化在进程中传递对象;
*
* 序列化方法:
* 1、实现Serializable 接口 ---- JAVA SE 本身支持的;
* 2、实现Parcelable 接口 ---- Android 特有的功能,效率比前者的高
*
* 选取序列化方法的原因:
* 1、在使用内存的时候,Parcelable 类比 Serializable 性能高;
* 2、Serializable 在序列化的时候会产生大量的临时变量,从而引起频繁的GC;
* 3、Parcelable 不能使用在要将数据储存在磁盘上的情况,因为Parcelable 不
* 能很好的保证数据的持续性,在外界有变化的情况下;
*
* 使用方法:
* 1、Serializable 的实现,只需要实现Serializable 这个接口就行,系统会自动的序列化;
* 2、Parcelable 序列化实现:
* a、声明实现接口Parcelable
* b、实现Parcelable 的方法 writeToParcel ,将你的对象序列化为一个Parcel对象;
* c、实例化静态内部对象CREATOR,实现接口 Parcelable.Creator
* public static final Parcelable.Creator<T> CREATOR ,注意:public static
* final 一个不能少,内部对象CREATOR 的名称也不能改变,必须全部大写;
* d、完成了CREATOR 的代码,实现方法createFromParcel ,将 Parcel 对象反序列化为你的对象;
*
* 提示:通过writeToParcel 将你的对象映射成Parcel 对象,再通过createFromParcel将
* parcel映射成你的对象,也可以将Parcel看成是一个流,通过writeToParcel 把对象写到
* 流里面,在通过createFromParcel 把对象从流里面读取对象,只不过这个过程需要自己来实现,
* 因此写的顺序和读的顺序必须一致;
*
* 3、支持的数据类型:byte double float int long String 六种; 以及他们的数组;
*
*
*/

使用ParcelableData 序列化数据并进行传递:
package com.sun.parcelable;

import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;

public class ParcelableData implements Parcelable {

private String name;
private String[] names;
private int age;
private float score;
private double money;
private byte file; // -128 -127
private long longname;


//构造方法
public ParcelableData(String name, String[] names, int age, float score,
double money, byte file, long longname) {
super();
this.name = name;
this.names = names;
this.age = age;
this.score = score;
this.money = money;
this.file = file;
this.longname = longname;
}


public String[] getNames() {
return names;
}


public void setNames(String[] names) {
this.names = names;
}


public ParcelableData(){}

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 float getScore() {
return score;
}

public void setScore(float score) {
this.score = score;
}

public double getMoney() {
return money;
}

public void setMoney(double money) {
this.money = money;
}

public byte getFile() {
return file;
}

public void setFile(byte file) {
this.file = file;
}

public long getLongname() {
return longname;
}

public void setLongname(long longname) {
this.longname = longname;
}

// 内容描述接口 , 默认返回 0 就可以了
public int describeContents() {

return 0;
}

// 读取接口,将 对象 序列化成 Parcel
public void writeToParcel(Parcel dest, int flags) {
Log.i("msg","writeToParcel() 进来了,准备开始对象序列化....");
dest.writeString(name);
dest.writeInt(age);
dest.writeByte(file);
dest.writeLong(longname);
dest.writeDouble(money);
dest.writeFloat(score);
dest.writeStringArray(names);
Log.i("msg","writeToParcel() 序列化完成,即将退出...");
}

/**
* 实例化静态内部对象CREATOR ,该对实现接口Parcelable.Creator
* 注意:public static final 一个都不能少,内部对象名称CREATOR 不能变,必须为大写
*/
public static final Parcelable.Creator<ParcelableData> CREATOR = new Creator<ParcelableData>() {

// 将 Parcel 对象 反序列化为对象
public ParcelableData createFromParcel(Parcel source) {
Log.i("msg","createFromParcel() 进来了,准备开始反序列化....");
ParcelableData pd = new ParcelableData();
pd.setName(source.readString());
pd.setAge(source.readInt());
pd.setFile(source.readByte());
pd.setLongname(source.readLong());
pd.setMoney(source.readDouble());
pd.setScore(source.readFloat());

// 反序列 数组
pd.setNames(source.createStringArray());
Log.i("msg","createFromParcel() 反序列化完成,即将退出,返回对象....");
return pd;
}

public ParcelableData[] newArray(int size) {

return null;
}

};

}


[size=medium][color=red][b]发送序列化的数据:[/b][/color][/size]
package com.sun.parcelable;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// 携带数据跳转 并显示
Intent intent = new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);
ParcelableData pd = new ParcelableData();
pd.setAge(12);
pd.setFile(Byte.parseByte("123")); // -128 --- 127
pd.setLongname(54455);
pd.setMoney(11.001);
pd.setName("卫斯理");
pd.setNames(new String[]{"numbe1","number2"});
pd.setScore(23.2f);
Bundle bundle = new Bundle();
Log.i("msg", "Bundle对象初始化完成,马上进入putParcelable 操作....");
bundle.putParcelable("pd",pd);
Log.i("msg","putParcelable() 存入数据完成....Intent 准备带入数据...");
intent.putExtras(bundle);
Log.i("msg","intent.putExtras(bundle) 完成...马上开始跳转...");
startActivity(intent);
Log.i("msg","跳转中....");

}
}


[size=medium][color=red][b]接收数据:[/b][/color][/size]

package com.sun.parcelable;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;

public class SecondActivity extends Activity{

protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.secondactivity_layout);

EditText show = (EditText) findViewById(R.id.show);
Log.i("msg","开始获得传递过来的相关数据 , Intent bundle ....");
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
Log.i("msg","Intent对象获取完毕,下一步获取ParcelableData对象....");
ParcelableData pd = bundle.getParcelable("pd");
Log.i("msg","ParcelableData 对象获取完毕,下一步显示");
show.setText(pd.getAge()+"\n"+""+pd.getFile()+"\n"+pd.getLongname()+"\n"+pd.getMoney()+"\n"+pd.getName()+"\n"+pd.getScore()+"\n"+pd.getNames().length);

}



}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值