Android - Parcel & Parcelable

对于Parcel的理解: 在Android系统中,定位为针对内存受限的设备,因此对性能要求更高,另外系统中采用了新的IPC(进程间通信)机制,必然要求使用性能更出色的对象传输方式。显然,JAVA的Serialize利用外部存储设备被认为是低效的, 可能也无法完美匹配Binder机制。在这样的环境下,Parcel被设计出来,其定位就是轻量级的高效的对象序列化和反序列化机制。

为了便于ipc之间传递的数据的操作,binder引入了parcel的概念。parcel可以想成快递公司的包装箱,需要传递的各种类型的数据都被打包进parcel类,binder负责传递parcel对象,接收端则从parcel解出数据。这样的机制即减少了各种数据类型对传递的复杂性,又可以通过增加打包/解包parcel的数据类型,轻易实现扩展。 parcel已经支持容纳基本数据类型和一些复合数据类型。

下面内容转自 dairyman的专栏:http://blog.csdn.net/dairyman000/article/details/7247619

Parcel 在英文中有两个意思,其一是名词,为包裹,小包的意思; 其二为动词,意为打包,扎包。邮寄快递中的包裹也用的是这个词。
Android采用这个词来表示封装消息数据。这个是通过IBinder通信的消息的载体。需要明确的是Parcel用来存放数据的是内存(RAM),而不是永久性介质(Nand等)。

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

接口的定义如下:

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

在实现Parcelable的实现中,规定了必须定义一个静态成员, 初始化为嵌入接口的实现类。

1
2
public static Parcel.Creator<DrievedClassName>  CREATOR
  =  new Parcel.Creator<DrievedClassName>();

下面内容转自 Java-Jinguo:http://jinguo.iteye.com/blog/657240

需求:我们经常需要在多个部件(activity或service)之间通过Intent传递一些数据,简单类型(如数字、字符串)的可以直接放入Intent。复杂类型(例如,J2ee中的Bean)的必须实现Parcelable接口。示例如下:

SampleBean.java

class SampleBean implements Parcelable
{
    private Bundle mBundle=new Bundle();
    public String getArriveTime()
    {
        return mBundle.getString("arriveTime");
    }
    public String getOlTime()
    {
        return mBundle.getString("olTime");
    }
    public void setArriveTime(String arriveTime)
    {
        this.mBundle.putString("arriveTime", arriveTime);
    }
    public void setOlTime(String olTime)
    {
        this.mBundle.putString("olTime", olTime);
    }
public int describeContents()
    {
        return 0;
    }
public void writeToParcel(Parcel out, int arg1)
    {
        out.writeBundle(this.mBundle);
    }
    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
        public TrainInfo createFromParcel(Parcel in)
        {
            SampleBean ti=new SampleBean();
            ti.mBundle=in.readBundle();  // 从Parcel中读出Bundle
            return ti;
        }
        public SampleBean[] newArray(int size)
        {
            return new SampleBean[size];
        }
    };
}


这里采用Bundle是因为在Parcel中并没有key的概念存在,而Bundle相当于Map。


下面内容转自 lincode :http://www.blogjava.net/lincode/archive/2011/09/16/358805.html

Serializable 和 Parcelable 区别

android 中自定义的对象序列化的问题有两个选择一个是Parcelable,
另外一个是Serializable。

一 序列化原因:
  1. 永久性保存对象,保存对象的字节序列到本地文件中;
  2. 通过序列化对象在网络中传递对象;
  3. 通过序列化在进程间传递对象。
二 至于选取哪种可参考下面的原则:
  1. 在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。
  2. Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
  3. Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。
    尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议你用Serializable 。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Parcelable Code Generators是一种用于自动生成Android Parcelable接口相关代码的工具。在Android开发中,Parcelable接口常常用于在Activity之间传递自定义对象。但是手动实现Parcelable接口并编写相关的代码是繁琐且容易出错的,因此开发人员常常使用Parcelable Code Generators来自动生成这些代码。 Parcelable Code Generators可以帮助开发人员简化Parcelable接口的实现过程。它通过解析自定义对象的属性和方法,生成相应的Parcelable接口实现。开发人员只需要在自定义对象上添加一些注解或配置,然后使用Parcelable Code Generators生成器工具即可自动生成Parcelable相关的代码,包括序列化和反序列化的方法。 使用Parcelable Code Generators的好处是提高了开发效率,减少了手动实现Parcelable接口所需的工作量。开发人员只需要关注对象的定义和注解的配置,而无需费心编写复杂的序列化和反序列化代码。此外,Parcelable Code Generators还可以保证生成的代码的正确性和稳定性,避免了手动编写代码过程中可能出现的错误。 总之,Android Parcelable Code Generators是一种实用工具,能够帮助开发人员自动生成Parcelable相关代码,提高开发效率,减少错误。使用它可以简化开发过程,使得在Activity之间传递自定义对象变得更加方便和可靠。 ### 回答2: Android中实现Parcelable接口可以用于实现对象的序列化和反序列化,方便数据的传递和保存。然而,手动编写Parcelable的代码需要写入大量重复的代码,比较繁琐且易出错。因此,有一些代码生成器可以用来自动生成Parcelable代码,简化并加速开发过程。 一种常用的Android Parcelable代码生成器是插件&quot;Parcelable Code Generator&quot;。这个插件可以作为Android Studio的一个扩展来安装和使用。Parcelable Code Generator使用注解处理器,可以根据模板自动生成Parcelable相关代码。 使用这个插件,我们只需要在需要实现Parcelable的Java类上添加一个注解,例如&quot;@Parcelable&quot;。然后,编译项目时插件会自动扫描注解,根据类的字段自动生成Parcelable的代码。生成的代码中包含了Parcelable接口的实现和parcelable的函数,这样就可以将对象序列化到Parcel中,或者将Parcel中的数据还原到对象中。 Parcelable Code Generator还支持一些配置选项,比如可以指定Parcelable的名称、包名、是否实现Parcelable.Creator等。此外,插件还支持自定义Parcelable代码的模板,可以根据需求自定义生成的Parcelable代码的格式和内容。 总之,Android Parcelable Code Generator插件简化了Parcelable代码的编写,提高了开发效率和代码质量。使用这个插件,可以省去手动写入Parcelable的代码,减少了出错的可能性,节省了开发时间。它是Android开发中的一种常见工具,为我们提供了方便快捷的Parcelable代码生成功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值