Android复杂数据模型序列化Parcelable

本文深入探讨了Android中自定义对象序列化的两种方式:Parcelable与Serializable的区别与应用场景,通过实例展示了如何在ParcelableActivity中发送RUIMember对象和对象列表,并在GetActivity中接收并打印这些数据。

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

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源码:

[java]  view plain copy
  1. package com.syl.parcelable;  
  2.   
  3. import android.os.Parcel;  
  4. import android.os.Parcelable;  
  5. import android.util.Log;  
  6.   
  7. public class RUIMember implements Parcelable{  
  8.     private static final String TAG = RUIMember.class.getSimpleName();  
  9.     private String mName = null;  
  10.     private String mSex = null;  
  11.     private String mPosition = null;  
  12.       
  13.     public RUIMember(String name, String sex, String positon) {  
  14.         mName = name;  
  15.         mSex = sex;  
  16.         mPosition = positon;  
  17.     }  
  18.       
  19.     public String getName() {  
  20.         return mName;  
  21.     }  
  22.       
  23.     public String getSex() {  
  24.         return mSex;  
  25.     }  
  26.       
  27.     public String getPosition() {  
  28.         return mPosition;  
  29.     }  
  30.   
  31.     @Override  
  32.     public String toString() {  
  33.         return "[mName] " + mName + " [mSex] " + mSex + " [mPosition] " + mPosition;  
  34.           
  35.     }  
  36.       
  37.     private RUIMember(Parcel source) {  
  38.         mName = source.readString();  
  39.         mSex = source.readString();  
  40.         mPosition = source.readString();  
  41.         Log.v(TAG, "==> RUIMember(Parcel source)");  
  42.     }  
  43.       
  44.     public static final Parcelable.Creator<RUIMember> CREATOR = new Creator<RUIMember>() {  
  45.   
  46.         @Override  
  47.         public RUIMember createFromParcel(Parcel source) {  
  48.             // TODO Auto-generated method stub  
  49.             return new RUIMember(source);  
  50.         }  
  51.   
  52.         @Override  
  53.         public RUIMember[] newArray(int size) {  
  54.             // TODO Auto-generated method stub  
  55.             Log.v(TAG, "==> newArray");  
  56.             return new RUIMember[size];  
  57.         }  
  58.     };  
  59.   
  60.     @Override  
  61.     public int describeContents() {  
  62.         // TODO Auto-generated method stub  
  63.         return 0;  
  64.     }  
  65.   
  66.     @Override  
  67.     public void writeToParcel(Parcel dest, int flags) {  
  68.         // TODO Auto-generated method stub  
  69.         Log.v(TAG, "writeToParcel");  
  70.         dest.writeString(mName);  
  71.         dest.writeString(mSex);  
  72.         dest.writeString(mPosition);  
  73.     }  
  74.   
  75. }  

ParcelableActivity.java源码:

[java]  view plain copy
  1. package com.syl.parcelable;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.app.Activity;  
  6. import android.content.Intent;  
  7. import android.os.Bundle;  
  8.   
  9. public class ParcelableActivity extends Activity {  
  10.     public static final String MEMBER = "member";  
  11.     public static final String MEMBER_LIST = "memberList";  
  12.       
  13.     ArrayList<RUIMember> mRUIMemberList = new ArrayList<RUIMember>();  
  14.     public RUIMember mRUIMember = null;  
  15.     /** Called when the activity is first created. */  
  16.     @Override  
  17.     public void onCreate(Bundle savedInstanceState) {  
  18.         super.onCreate(savedInstanceState);  
  19.         setContentView(R.layout.main);  
  20.           
  21.         Intent intent = new Intent(this, GetActivity.class);  
  22.         mRUIMember = new RUIMember("sunyl""male""developer");  
  23.           
  24.         mRUIMemberList.add(new RUIMember("yangyf""male""developer"));  
  25.         mRUIMemberList.add(new RUIMember("mahq""male""leader"));  
  26.         mRUIMemberList.add(new RUIMember("zhuym""female""tester"));  
  27.           
  28.         Bundle bundle = new Bundle();  
  29.         bundle.putParcelable(MEMBER, mRUIMember);  
  30.         bundle.putParcelableArrayList(MEMBER_LIST, mRUIMemberList);  
  31.         intent.putExtras(bundle);  
  32.           
  33.         startActivity(intent);  
  34.           
  35.     }  
  36. }  

GetActivity.java源码:

[java]  view plain copy
  1. package com.syl.parcelable;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.app.Activity;  
  6. import android.os.Bundle;  
  7. import android.util.Log;  
  8.   
  9. public class GetActivity extends Activity {  
  10.     private static final String TAG = GetActivity.class.getSimpleName();  
  11.     private RUIMember mSyl = null;  
  12.     private ArrayList<RUIMember> mList = new ArrayList<RUIMember>();  
  13.     @Override  
  14.     protected void onCreate(Bundle savedInstanceState) {  
  15.         // TODO Auto-generated method stub  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.main);  
  18.           
  19.         Bundle bundle = getIntent().getExtras();  
  20.         mSyl = bundle.getParcelable(ParcelableActivity.MEMBER);  
  21.         Log.v(TAG, mSyl.toString());  
  22.           
  23.         mList = bundle.getParcelableArrayList(ParcelableActivity.MEMBER_LIST);  
  24.         for (RUIMember rm : mList) {  
  25.             Log.v(TAG, "from mList:" + rm.toString());  
  26.         }  
  27.           
  28.     }  
  29.   
  30. }  

打印信息:



从打印结果中可以分析出,有四个对象分别进行序列化和反序列化。在GetActivity中也收到了ParcelableActivity中传过来的数据。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值