android中自定义的对象序列化的问题有两个选择一个是Parcelable,另外一个是Serializable。
关于Serializable感兴趣可以看Think InJava 或EffectiveJava 中与序列化相关的内容。在此,主要介绍Parcelable的相关内容。
一序列化原因:
1.永久性保存对象,保存对象的字节序列到本地文件中;
2.通过序列化对象在网络中传递对象;
3.通过序列化在进程间传递对象(Activity之间通过Intent传递值,支持基本数据类型和String对象及它们的数组对象byte、byte[]、char、char[]、boolean、boolean[]、short、short[]、int、int[]、long、long[]、float、float[]、double、double[]、String、String[],还有实现Serializable、Parcelable接口的类对象。)。
二至于选取哪种可参考下面的原则:
1.在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。
2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GarbageCollection。
3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议你用Serializable 。
三 Parcelable序列化方法
android提供了一种新的类型:Parcel。本类被用作封装数据的容器,封装后的数据可以通过Intent或IPC传递。
除了基本类型以外,只有实现了Parcelable接口的类才能被放入Parcel中。
Parcelable实现要点:需要实现三个东西
1)writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.声明如下:
writeToParcel(Parcel dest, int flags) 具体参数含义见javadoc
2)describeContents方法。返回0即可。
3)静态的Parcelable.Creator接口,本接口有两个方法:
createFromParcel(Parcelsource) 实现从in中创建出类的实例的功能
newArray(intsize) 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。
四实例分析及源码
本实例实现的功能是在ParcelableActivity中发送RUIMember的对象和对象列表;再在GetActivity中接收ParcelableActivity传过来的数据,并用Log打印出来。
RUIMember.java源码:
package com.syl.parcelable; import android.os.Parcel; import android.os.Parcelable; import android.util.Log; public class RUIMember implements Parcelable{ private static final String TAG = RUIMember.class.getSimpleName(); private String mName = null; private String mSex = null; private String mPosition = null; public RUIMember(String name, String sex, String positon) { mName = name; mSex = sex; mPosition = positon; } public String getName() { return mName; } public String getSex() { return mSex; } public String getPosition() { return mPosition; } @Override public String toString() { return "[mName] " + mName + " [mSex] " + mSex + " [mPosition] " + mPosition; } private RUIMember(Parcel source) { mName = source.readString(); mSex = source.readString(); mPosition = source.readString(); Log.v(TAG, "==> RUIMember(Parcel source)"); } public static final Parcelable.Creator<RUIMember> CREATOR = new Creator<RUIMember>() { @Override public RUIMember createFromParcel(Parcel source) { // TODO Auto-generated method stub return new RUIMember(source); } @Override public RUIMember[] newArray(int size) { // TODO Auto-generated method stub Log.v(TAG, "==> newArray"); return new RUIMember[size]; } }; @Override public int describeContents() { // TODO Auto-generated method stub return 0; } @Override public void writeToParcel(Parcel dest, int flags) { // TODO Auto-generated method stub Log.v(TAG, "writeToParcel"); dest.writeString(mName); dest.writeString(mSex); dest.writeString(mPosition); } }
ParcelableActivity.java源码:
package com.syl.parcelable; import java.util.ArrayList; import android.app.Activity; import android.content.Intent; import android.os.Bundle; public class ParcelableActivity extends Activity { public static final String MEMBER = "member"; public static final String MEMBER_LIST = "memberList"; ArrayList<RUIMember> mRUIMemberList = new ArrayList<RUIMember>(); public RUIMember mRUIMember = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Intent intent = new Intent(this, GetActivity.class); mRUIMember = new RUIMember("sunyl", "male", "developer"); mRUIMemberList.add(new RUIMember("yangyf", "male", "developer")); mRUIMemberList.add(new RUIMember("mahq", "male", "leader")); mRUIMemberList.add(new RUIMember("zhuym", "female", "tester")); Bundle bundle = new Bundle(); bundle.putParcelable(MEMBER, mRUIMember); bundle.putParcelableArrayList(MEMBER_LIST, mRUIMemberList); intent.putExtras(bundle); startActivity(intent); } }
GetActivity.java源码:
package com.syl.parcelable; import java.util.ArrayList; import android.app.Activity; import android.os.Bundle; import android.util.Log; public class GetActivity extends Activity { private static final String TAG = GetActivity.class.getSimpleName(); private RUIMember mSyl = null; private ArrayList<RUIMember> mList = new ArrayList<RUIMember>(); @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.main); Bundle bundle = getIntent().getExtras(); mSyl = bundle.getParcelable(ParcelableActivity.MEMBER); Log.v(TAG, mSyl.toString()); mList = bundle.getParcelableArrayList(ParcelableActivity.MEMBER_LIST); for (RUIMember rm : mList) { Log.v(TAG, "from mList:" + rm.toString()); } } }
打印信息:
从打印结果中可以分析出,有四个对象分别进行序列化和反序列化。在GetActivity中也收到了ParcelableActivity中传过来的数据。