一.序列化的目的
永久性保存对象,保存对象的字节序列到本地文件中;
通过序列化对象在网络中传递对象;
通过序列化在进程间传递对象;
在Intent中进行传递复杂自定义类对象时,需要实现Parcelable接口.

二.实现序列化的方法及优缺点比较
1.实现Serializable接口,不需要实特定的接口,相当于对象打了一个标记,系统会自动将其序列化.
优点: 可将数据存储在磁盘
缺点: 在Android系统中,序列化时会产生大量的临时变量引起频繁的GC.
2.实现Parcelable接口,为Android特有,需要按照一定的规范来实现.
Parcelable接口通过writeToParcel方法将对象映射为Parcel对象,再通过内部类对象CREATOR的方法createFromParcel将Parcel对象映射到特定的对象.
其中writeToParcel和createFromParcel必须实现,并且读写的顺序必须保持一致.
优点: 在内存中操作,性能高.
缺点: 外界有变化时不能很好的保证数据的持续性,因此不能用这种方法将数据保存到磁盘中.

三.Parcelable接口使用方法
实现Parcelable接口, 实现以下方法
public int describeContents()
public void writeToParcel(Parcel dest, int flags)
假设新的类为T,实现构造方法
public T(Parcel in)
定义静态内部对象CREATOR实现接口Parcelable.Creator, 其中public static final都不能缺少,CREATOR全为大写不能变.格式如下
public static final Parcelable.Creator<T> CREATOR
实例如下,
public static final Parcelable.Creator<T> CREATOR = new Creator<T>() {

@Override
public T[] newArray(int size) {
return new T[size];
}

@Override
public T createFromParcel(Parcel source) {
return new T(source);
}
};
PS: createFromParcel方法实现从Parcel中读取数据,封装成Parcelable对象返回逻辑层.
newArray返回一个类型为T的数组,供外部反序列化本类数组使用.

四.代码示例

import android.os.Parcel;
import android.os.Parcelable; public class Person implements Parcelable { private long mId;
private int mAge;
private String mName;
private String mAddress;
public Object mExtra; public Person(long id, int age, String name, String Address, Object extra) {
mId = id;
mAge = age;
mName = name;
mAddress = Address;
mExtra = extra;
} public Person(Parcel in) {
mId = in.readLong();
mAge = in.readInt();
mName = in.readString();
if (in.readByte() == 1) {
mExtra = in.readParcelable(getClass().getClassLoader());
}
mAddress = in.readString();
} @Override
public int describeContents() {
return 0;
} @Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(mId);
dest.writeInt(mAge);
dest.writeString(mName); Parcelable p = null;
if (mExtra != null) {
try {
p = (Parcelable) mExtra;
} catch (ClassCastException e) {
p = null;
}
}
if (p != null) {
dest.writeByte((byte) 1);
dest.writeParcelable(p, flags);
} else {
dest.writeByte((byte) 0);
} dest.writeString(mAddress);
} public static final Parcelable.Creator<Person> CREATOR = new Creator<Person>() { @Override
public Person[] newArray(int size) {
return new Person[size];
} @Override
public Person createFromParcel(Parcel source) {
return new Person(source);
}
};
}

Parcelable序列化对象的更多相关文章

  1. Android 使用Parcelable序列化对象

    转:http://ipjmc.iteye.com/blog/1314145       Android序列化对象主要有两种方法,实现Serializable接口.或者实现Parcelable接口.实现 ...

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

    学习内容: 1.序列化的目的 2.Android中序列化的两种方式 3.Parcelable与Serializable的性能比较 4.Android中如何使用Parcelable进行序列化操作 5.P ...

  3. Android使用HttpURLConnection通过POST方式发送java序列化对象

    使用HttpURLConnection类不仅可以向WebService发送字符串,还可以发送序列化的java对象,实现Android手机和服务器之间的数据交互. Android端代码: public ...

  4. 序列化对象为xml字符串

    /// <summary>    /// 序列化对象为xml字符串    /// </summary>    /// <param name="obj" ...

  5. Serializable序列化对象

    Serializable序列化对象发送: Intent intent = new Intent(); intent.setClass(mContext, HomeDetailReportActivit ...

  6. C# 使用XML序列化对象(二)

    在C# 使用XML序列化对象(一)中描述了使用XML序列化对象的最简单的实现. 现在我们来看看稍微复杂一点的情况: 现有两个类:A和B,B是A的派生类,如下所示: public class A { p ...

  7. Android中序列化对象到XMl 和 XML反序列化为对象

    package com.example.xmloperation; import java.io.File; import java.io.FileOutputStream; import java. ...

  8. android中实现Parcelable序列化步骤

    import java.io.Serializable; import java.text.DecimalFormat; import android.os.Parcel; import androi ...

  9. 2进制,16进制,BCD,ascii,序列化对象相互转换

    public final static char[] BToA = "0123456789abcdef".toCharArray() ; 1.16进制字符串转为字节数组 /** * ...

随机推荐

  1. Leetcode-跳跃游戏

    跳跃游戏     给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] ...

  2. XX出行项目子系统-统计系统设计(定时器项目设计例子)

    一. 引言 目前开发的XX出行系统,需要开发数据统计功能,鉴于约约出行系统已经在运营,并且有新版本的迭代,方便以后下个版本复用,遂新建一个子系统. 二. 架构设计 三. 具体实现 1.MySql数据库 ...

  3. Y460蓝牙键盘无法连接问题解决

    mac坏了,无法启动,一直没时间去修理. 近期把大学的时候用的笔记本又翻了出来,小Y,经典的“娱乐本” Y460. Y460上之前被自己各种重装系统,反复从windows到双系统,再到linux之间来 ...

  4. LeetCode 120——三角形最小路径和

    1. 题目 2. 解答 详细解答方案可参考北京大学 MOOC 程序设计与算法(二)算法基础之动态规划部分. 从三角形倒数第二行开始,某一位置只能从左下方或者右下方移动而来,因此,我们只需要求出这两者的 ...

  5. STM32F4编程手册学习2_内存模型

    STM32F4编程手册学习2_内存模型 1. 内存映射 MCU将资源映射到一段固定的4GB可寻址内存上,如下图所示. 内存映射将内存分为几块区域,每一块区域都有一个定义的内存类型,一些区域还有一些附加 ...

  6. 操作系统及Python解释器工作原理讲解

    操作系统介绍 操作系统位于计算机硬件与应用软件之间 是一个协调.管理.控制计算机硬件资源与软件资源的控制程序 操作系统功能: 控制硬件 把对硬件复杂的操作封装成优美简单的接口(文件),给用户或者应用程 ...

  7. HTMLTestRunner解决UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 108: ordinal not in range(128)

    其中HTML和数据库都是设置成utf-8格式编码,插入到数据库中是正确的,但是当读取出来的时候就会出错,原因就是python的str默认是ascii编码,和unicode编码冲突,就会报这个标题错误. ...

  8. Thunder团队Beta周贡献分分配结果

    小组名称:Thunder 项目名称:爱阅app 组长:王航 成员:李传康.翟宇豪.邹双黛.苗威.宋雨.胡佑蓉.杨梓瑞 分配规则 规则1:基础分,拿出总分的20%(8分)进行均分,剩下的80%(32分) ...

  9. AjaxPro怎么用

    AjaxPro是首家支持以各种方式通过javascript访问服务端.net的免费库,类似于SAJAX.它能把Javascript请求发送到.NET方法,服务端传回给Javascript,甚至包括串行 ...

  10. arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf的区别

    转自 https://www.cnblogs.com/linuxbo/p/4297680.html 命名规则 交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eab ...