码迷,mamicode.com
首页 > 其他好文 > 详细

Activity之间序列化传递Object

时间:2016-05-12 19:10:29      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:

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会有数据错乱的现象。

Activity之间序列化传递Object

标签:

原文地址:http://blog.csdn.net/tianmaxingkong_/article/details/51354520

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!