Activity之间序列化传递Object

本文详细介绍了在Android应用中通过Intent和Bundle跳转时,如何使用Intent来传递基本数据类型、String及实现了Parcelable接口或Serializable接口的Object。重点阐述了Serializable和Parcelable接口的区别及实现方式,以及如何在两个Activity之间进行数据的传递与接收。

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

Activity之间可以通过Intent和Bundle跳转并传递数据,可以传递的数据类型包括基本数据类型,String以及实现了Parcelable接口或Serializable接口的Object(File实现了Serializable接口):

1.Serializable接口是java中定义实现的,无须重写任何方法,但序列化和反序列化的过程中会产生大量中间变量,占用较大的内存

2.Parcelable接口,是Google专门为Android序列化定制的,序列化过程需要重写writeToParcel(Parcel dest, int flag)方法,反序列化时需要实现一个Parcelable.create<T>的变量。


实现Parcelable接口进行序列化和反序列化:

package com.hust.andoirdStudy;

import android.graphics.Bitmap;
import android.os.Parcel;
import android.os.Parcelable;

public class Person implements Parcelable
{

	public String name;
	public String birthPlace;
	public int age;
	public Bitmap icon;

	public Person()
	{ // 空的构造方法
	}

	@Override
	public int describeContents()
	{
		return 0;
	}

	@Override
	public void writeToParcel(Parcel dest, int flags)
	{ // writeToParcel负责讲this对象写入Parcel文件中
		dest.writeString(name);
		dest.writeString(birthPlace);
		dest.writeInt(age);
		icon.writeToParcel(dest, 0);
	}

	public static final Parcelable.Creator<Person> CREATE = new Creator<Person>()
	{// CREATE方法实现讲Parcel中序列化的对象反序列化为Object
		@Override
		public Person createFromParcel(Parcel source)
		{
			Person person = new Person();
			person.name = source.readString();
			person.birthPlace = source.readString();
			person.age = source.readInt();
			person.icon = Bitmap.CREATOR.createFromParcel(source);

			return person;
		}

		@Override
		public Person[] newArray(int size)
		{
			return new Person[size];
		}
	};

}

实现Serializable接口进行序列化和反序列化:

package com.hust.andoirdStudy;

import java.io.Serializable;

import android.graphics.Bitmap;

public class Person implements Serializable
{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public String name;
	public String birthPlace;
	public int age;
	public Bitmap icon;

	public Person()
	{ // 空的构造方法
	}

}

实现了上面任意一种接口之后,便可以在两个Activity之间传递Object了:

/**
* 假设已经有一个存储数据的Person对象
*/
Person person = new Person();

发送方-Parcelable:

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("personID", 1110); // 传递普通数据
// 传递实现了Parcelable接口的Object, 当然普通数据也可以放在Bundle中传递
Bundle bundle = new Bundle();
bundle.putParcelable("person", person);
intent.putExtras(bundle);
startActivity(intent);

接收方-Parcelable:

int personID = getIntent().getExtras().getInt("personID");
Person person = getIntent().getParcelableExtra("person");


发送方-Serializable:

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("person", person);
startActivity(intent);

接收方-Serializable:

Person p = (Person) getIntent().getSerializableExtra("person");

[注意]

序列化的本质是将Object的属性信息按照一定的顺序(在Parcelable接口中,按照writeToParcel中写入的顺序)写入序列化文件,而在反序列化过程中按照之前的顺序读出,并创建赋值给一个新的Object,所以要求writeToParcel(Parcel, int)函数中Object属性写入的顺序一定要和Parcelable.Creator<T>中的createFromParcel(Parcel)中read的顺序一致,不然反序列化后得到的Object会有数据错乱的现象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值