Parcelable序列化对象
一.序列化的目的
    永久性保存对象,保存对象的字节序列到本地文件中;
    通过序列化对象在网络中传递对象;
    通过序列化在进程间传递对象;
    在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序列化对象的更多相关文章
- Android 使用Parcelable序列化对象
		转:http://ipjmc.iteye.com/blog/1314145 Android序列化对象主要有两种方法,实现Serializable接口.或者实现Parcelable接口.实现 ... 
- Android中Serializable和Parcelable序列化对象详解
		学习内容: 1.序列化的目的 2.Android中序列化的两种方式 3.Parcelable与Serializable的性能比较 4.Android中如何使用Parcelable进行序列化操作 5.P ... 
- Android使用HttpURLConnection通过POST方式发送java序列化对象
		使用HttpURLConnection类不仅可以向WebService发送字符串,还可以发送序列化的java对象,实现Android手机和服务器之间的数据交互. Android端代码: public ... 
- 序列化对象为xml字符串
		/// <summary> /// 序列化对象为xml字符串 /// </summary> /// <param name="obj" ... 
- Serializable序列化对象
		Serializable序列化对象发送: Intent intent = new Intent(); intent.setClass(mContext, HomeDetailReportActivit ... 
- C# 使用XML序列化对象(二)
		在C# 使用XML序列化对象(一)中描述了使用XML序列化对象的最简单的实现. 现在我们来看看稍微复杂一点的情况: 现有两个类:A和B,B是A的派生类,如下所示: public class A { p ... 
- Android中序列化对象到XMl 和 XML反序列化为对象
		package com.example.xmloperation; import java.io.File; import java.io.FileOutputStream; import java. ... 
- android中实现Parcelable序列化步骤
		import java.io.Serializable; import java.text.DecimalFormat; import android.os.Parcel; import androi ... 
- 2进制,16进制,BCD,ascii,序列化对象相互转换
		public final static char[] BToA = "0123456789abcdef".toCharArray() ; 1.16进制字符串转为字节数组 /** * ... 
随机推荐
- 深入理解java虚拟机学习笔记(一)
			第二章 Java内存区域与内存溢出异常 运行时数据区域 程序计数器(Program Counter Register) 程序计数器:当前线程所执行的字节码行号指示器.各条线程之间计数器互不影响,独立存 ... 
- [SHELL]结构化命令之条件语句
			1.if-then语句 #!/bin/bash username="root" if grep $username /etc/passwd then echo "the ... 
- Nodejs基础之redis
			安装redis 模块 npm install redis 1 代码部分 const redis = require('redis') const client = redis.createClient ... 
- 在mesh client示例中加入spi_slave接口(without IDE)
			在mesh client示例中加入spi_slave接口(without IDE) 主要是理解cmake构建的过程,然后修改工程中的inlcude路径及c源文件. 1. 解压mesh_sdk unzi ... 
- 十:HDFS Short-Circuit Local Reads 短路本地读取
			当client请求数据时,datanode会读取数据然后通过TCP协议发送给client.short-circuit绕过了datanode直接读取数据.short-circuit的前提是client和 ... 
- BZOJ 3790 神奇项链 hash/后缀自动机+贪心
			Description 母亲节就要到了,小 H 准备送给她一个特殊的项链.这个项链可以看作一个用小写字母组成的字符串,每个小写字母表示一种颜色. 为了制作这个项链,小 H 购买了两个机器.第一个机器可 ... 
- Python的string模块化方法
			Python 2.X中曾经存在过一个string模块,这个模块里面有很多操作字符串的方法,但是在Python 3.X中,这些模块化方法已经被移除了(但是string模块本身没有被移除,因为它还有其他可 ... 
- C语言--链表基础模板
			1.建立结构体 struct ST { int num;///学号 int score;///成绩 struct ST*next; };///结构体 2.空链表的创建 struct ST creatN ... 
- “Hello World!”团队第三周召开的第五次会议
			一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.代码地址 一.会议时间 2017年10月31日 11:45-12:17 二.会议地点: ... 
- 转 Js 跨域CORS报错 Response for preflight has invalid HTTP status code 405
			转自:http://www.cnblogs.com/SilenceTom/p/6697484.html 调用接口遇到Response for preflight has invalid HTTP st ... 
