Android 序列化对象接口Parcelable使用方法

什么是Parcelable ?

Parcelable,定义了将数据写入Parcel,和从Parcel中读出的接口。一个实体(用类来表示),如果需要封装到消息中去,就必须实现这一接口,实现了这一接口,该实体就成为“可打包的”了。

Parcelable 传递对象

Android序列化对象主要有两种方法:

1.实现Serializable接口,实现Serializable接口是JavaSE本身就支持的;

2.实现Parcelable接口,Parcelable是Android特有的功能,效率比实现Serializable接口高,像用于Intent数据传递也都支持,而且还可以用在进程间通信(IPC),

除了基本类型外,只有实现了Parcelable接口的类才能被放入Parcel中。

Parcelable接口定义

[java] view
plain
copyprint?

  1. public interface Parcelable {
  2. //内容描述接口,基本不用管
  3. public int describeContents();
  4. //写入接口函数,打包
  5. public void writeToParcel(Parcel dest, int flags);
  6. //读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入。
  7. //为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例。
  8. public interface Creator<T> {
  9. public T createFromParcel(Parcel source);
  10. public T[] newArray(int size);
  11. }

实现Parcelable接口?

   从parcelable接口定义中,我们可以看到,实现parcelable接口,需要我们实现下面几个方法:

1.describeContents方法。内容接口描述,默认返回0就可以;

2.writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.即打包需要传递的数据到Parcel容器保存,以便从parcel容器获取数据,该方法声明如下:

writeToParcel (Parcel dest, int flags) 具体参数含义见javadoc

3.静态的Parcelable.Creator接口,本接口有两个方法:

createFromParcel(Parcel in)  从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。

newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。方法是供外部类反序列化本类数组使用。

代码实现

    1.封装数据,把实现parcelable接口的Person对象传递到TwoActivity里;

[java] view
plain
copyprint?

  1. public class DemoActivity extends Activity {
  2. /** Called when the activity is first created. */
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.main);
  7. // 封装数据
  8. Person p = new Person();
  9. p.setId(1);
  10. p.setName("xiaoming");
  11. // 用Intent传递Person对象
  12. Intent i = new Intent(this, TwoActivity.class);
  13. i.putExtra("Person", p);
  14. startActivity(i);
  15. }
  16. }

2.TwoActivity获取数据,从DemoActivity传递的Person对象给解析,并打印;

[java] view
plain
copyprint?

  1. public class TwoActivity extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. // TODO Auto-generated method stub
  5. super.onCreate(savedInstanceState);
  6. Person p = (Person)getIntent().getParcelableExtra("Person");
  7. System.out.println("p_id"+p.getId());
  8. System.out.println("p_name"+p.getName());
  9. }
  10. }

3.parcelable接口的实现

[java] view
plain
copyprint?

  1. public class Person implements Parcelable{
  2. // 成员变量
  3. private int id;
  4. private String name;
  5. // 1.必须实现Parcelable.Creator接口,否则在获取Person数据的时候,会报错,如下:
  6. // android.os.BadParcelableException:
  7. // Parcelable protocol requires a Parcelable.Creator object called  CREATOR on class com.um.demo.Person
  8. // 2.这个接口实现了从Percel容器读取Person数据,并返回Person对象给逻辑层使用
  9. // 3.实现Parcelable.Creator接口对象名必须为CREATOR,不如同样会报错上面所提到的错;
  10. // 4.在读取Parcel容器里的数据事,必须按成员变量声明的顺序读取数据,不然会出现获取数据出错
  11. // 5.反序列化对象
  12. public static final Parcelable.Creator<Person> CREATOR = new Creator(){
  13. @Override
  14. public Person createFromParcel(Parcel source) {
  15. // TODO Auto-generated method stub
  16. // 必须按成员变量声明的顺序读取数据,不然会出现获取数据出错
  17. Person p = new Person();
  18. p.setId(source.readInt());
  19. p.setName(source.readString());
  20. return p;
  21. }
  22. @Override
  23. public Person[] newArray(int size) {
  24. // TODO Auto-generated method stub
  25. return new Person[size];
  26. }
  27. };
  28. public int getId() {
  29. return id;
  30. }
  31. public void setId(int id) {
  32. this.id = id;
  33. }
  34. public String getName() {
  35. return name;
  36. }
  37. public void setName(String name) {
  38. this.name = name;
  39. }
  40. @Override
  41. public int describeContents() {
  42. // TODO Auto-generated method stub
  43. return 0;
  44. }
  45. @Override
  46. public void writeToParcel(Parcel dest, int flags) {
  47. // TODO Auto-generated method stub
  48. // 1.必须按成员变量声明的顺序封装数据,不然会出现获取数据出错
  49. // 2.序列化对象
  50. dest.writeInt(id);
  51. dest.writeString(name);
  52. }
  53. }
时间: 2024-10-12 12:58:56

Android 序列化对象接口Parcelable使用方法的相关文章

(转)Android 序列化对象接口Parcelable使用方法

http://blog.csdn.net/zpf8861/article/details/39400725

实现Android语音识别服务接口 RecognitionService的方法

之前的一篇文章介绍过SpeechRecognizer类,该类可以作为对外的一个接口,并通过Intent传递一个ComponentName获取可支持语音识别的功能的服务,一般的用户手机中如果安装了语音识别的一些软件,就会拥有这样的能力,但是如果开发者希望自己通过某公司的sdk集成自己的语音识别服务,那么就需要实现RecognitionService这个类. 这个类是个抽象类,需要开发者完成其中的几个抽象方法.下面的代码注释中对每个方法进行了说明. <pre name="code"

转载:在ASP.net 3.5中 用JSON序列化对象(两种方法)

asp.net3.5中已经集成了序列化对象为json的方法. 1:System.Runtime.Serialization.Json;    2:System.Web.Script.Serialization两个命名空间下的不同方法进行序列化和反序列化. 第一种方法:System.Runtime.Serialization.Json public class JsonHelper    {        /// <summary>        /// 生成Json格式        /// 

Gson序列化对象时排除字段

import com.google.gson.ExclusionStrategy; import com.google.gson.FieldAttributes; /** *Gson序列化对象排除属性 *调用方法: *String[] keys = { "id" }; *Gson gson = new GsonBuilder().setExclusionStrategies(new JsonKit(keys)).create(); */ public class JsonKit imp

Android中Serializable和Parcelable序列化对象详解

学习内容: 1.序列化的目的 2.Android中序列化的两种方式 3.Parcelable与Serializable的性能比较 4.Android中如何使用Parcelable进行序列化操作 5.Parcelable的工作原理 6.相关实例 1.序列化的目的 (1).永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中 (2).通过序列化操作将对象数据在网络上进行传输(由于网络传输是以字节流的方式对数据进行传输的.因此序列化的目的是将对象数据转换成字节流的形式) (3).将对象数据在进程

Android高手之路之Android中Intent传递对象的两种方法Serializable,Parcelable

注:本文改编自Android_Tutor的文章,原文地址:http://blog.csdn.net/android_tutor/article/details/5740845 Android中的传递有两个方法,一个是Serializable,另一个是Parcelable. Serializable是J2SE本身就支持的.而Parcelable是Android所特有的. 二者的使用场景和区别: 1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelab

android实现Parcelable序列化对象

package com.sl.pocketbook.bean; import android.os.Parcel; import android.os.Parcelable; import android.os.Parcelable.Creator; /**  * 品牌  *   * @author sxn  *   */ public class ProductBrandBean implements Parcelable {     /**      * id      */     pri

Android中传递对象的三种方法

Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! Android中,Activity和Fragment之间传递对象,可以通过将对象序列化并存入Bundle或者Intent中进行传递,也可以将对象转化为JSON字符串,进行传递. 序列化对象可以使用Java的Serializable的接口.Parcelable接口.转化成JSON字符串,可以使用Gson等库. 1.Serializable Model public class Author implement

Parcelable序列化对象

一.序列化的目的 永久性保存对象,保存对象的字节序列到本地文件中: 通过序列化对象在网络中传递对象: 通过序列化在进程间传递对象; 在Intent中进行传递复杂自定义类对象时,需要实现Parcelable接口. 二.实现序列化的方法及优缺点比较 1.实现Serializable接口,不需要实特定的接口,相当于对象打了一个标记,系统会自动将其序列化. 优点: 可将数据存储在磁盘 缺点: 在Android系统中,序列化时会产生大量的临时变量引起频繁的GC. 2.实现Parcelable接口,为And