序列化机制之-Parcel

本文介绍了Android中的序列化机制Parcel,它是一个轻量级、高效的对象序列化和反序列化工具,主要用于内存受限的设备和IPC通信。Parcel通过内存操作实现高效序列化,避免了Java序列化中使用外部存储的低效。文章还分析了Parcel的内存管理策略,并展示了如何在Activity间通过Intent使用Parcel传递复杂对象的示例。
摘要由CSDN通过智能技术生成

一.先从Serialize说起

         我们都知道Java中的Serialize机制,译成串行化、序列化……,其作用是能将数据对象存入字节流当中,在需要时重新生成对象。主要应用是利用外部存储设备保存对象状态,以及通过网络传输对象等。

 

二.Android中的新的序列化机制

         在Android系统中,定位为针对内存受限的设备,因此对性能要求更高,另外系统中采用了新的IPC(进程间通信)机制,必然要求使用性能更出色的对象传输方式。在这样的环境下,Parcel被设计出来,其定位就是轻量级的高效的对象序列化和反序列化机制。

 

三.Parcel类的背后

         在Framework中有parcel类,源码路径是:

Frameworks/base/core/java/android/os/Parcel.java

典型的源码片断如下:

/** 
 * Write an integer value into the parcel at the current dataPosition(), 
 * growing dataCapacity() if needed. 
 */  
public final native void writeInt(int val);  
  
/** 
 * Write a long integer value into the parcel at the current dataPosition(), 
 * growing dataCapacity() if needed. 
 */  
public final native void writeLong(long val); 
从中我们看到,从这个源程序文件中我们看不到真正的功能是如何实现的,必须透过 JNI 往下走了。于是, Frameworks/base/core/jni/android_util_Binder.cpp 中找到了线索
static void android_os_Parcel_writeInt(JNIEnv* env, jobject clazz, jint val)  
{  
    Parcel* parcel = parcelForJavaObject(env, clazz);  
    if (parcel != NULL) {  
        const status_t err = parcel->writeInt32(val);  
        if (err != NO_ERROR) {  
            jniThrowException(env, "java/lang/OutOfMemoryError", NULL);  
        }  
    }  
}  
  
static void android_os_Parcel_writeLong(JNIEnv* env, jobject clazz, jlong val)  
{  
    Parcel* parcel = parcelForJavaObject(env, clazz);  
    if (parcel != NULL) {  
        const status_t err = parcel->writeInt64(val);  
        if (err != NO_ERROR) {  
            jniThrowException(env, "java/lang/OutOfMemoryError", NULL);  
        }  
    }  
}  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值