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中传过来的数据。


更多相关文章

  1. Android(安卓)NDK开发的环境配置和使用
  2. Android(安卓)BaseAadapter 异步加载图片方法
  3. Android(安卓)java.lang.RuntimeException: Parcelable encounte
  4. EventBus从入门到装逼,源码分析,手撸框架
  5. Visual Studio 跨平台开发实战(5) - Xamarin Android(安卓)多页
  6. Android笔记:Android(安卓)UI学习 - 对话框 (AlertDialog & Progr
  7. Adnroid——自定义控件(入门篇之自定义验证码)
  8. Android(安卓)UI开发第十八篇――ActivityGroup实现tab功能
  9. 在Android中使用VideoView播放视频

随机推荐

  1. 盒模型,媒体查询,em,rem用法
  2. php命令行模式代码实例详解
  3. 选择器权重及伪类选择器练习
  4. 简单的登陆表单、后台框架、元素样式来源
  5. css选择器权重、伪类选择器计算方式
  6. HTML入门之常用伪类选择器的使用方法总结
  7. laravel数据库查询结果自动转数组修改实
  8. 选择器知识汇总
  9. PHP并发场景的三种解决方案代码实例
  10. 常用伪类选择器的实例演示及参数