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进制字符串转为字节数组 /** * ...
随机推荐
- 在github上面创建属于自己的个性主页
圈子里面越来越多的同事在github上面创建自己的项目文档,那里确实高手云集,海内外的技术大牛小牛们都在那儿有一席之地,为“helloword”贡献自己. 以上感慨略过... 这几日正想创建一个自己的 ...
- MySQL数据库怎么截取字符串?
函数: 1.从左开始截取字符串 left(str, length) 说明:left(被截取字段,截取长度) 例:select left(content,200) as abstract from my ...
- 关于excle导数据的一些代码笔记
package com.bonc.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutpu ...
- phantomjs抛出IOException
使用phantomjs对网页进行截图遇到的问题 问题描述: 使用的phantomjs版本:phantomjs-2.1.1-windows 使用的截图js文件,\phantomjs-2.1.1-wind ...
- 软件工程第六周psp
1.psp表格 类别 任务 开始时间 结束时间 中断时间 delta时间 立会 讲技术文档,分配任务 10月20日16:17 10月20日16:50 0 33分钟 准备工作 根据任务查资料 10月20 ...
- java日期格式处理
继承关系:java.lang.Object->java.text.Format->java.text.DateForm->java.text.SimpleDateFormat 日期代 ...
- Internet Secure
key Secret key(密钥):ues the same key to Encryption and decryption(symmetric-key)对称加密,需要绝对安全的空间来传递key ...
- android BadgeView的使用(图片上的文字提醒)
BadgeView主要是继承了TextView,所以实际上就是一个TextView,底层放了一个label,可以自定义背景图,自定义背景颜色,是否显示,显示进入的动画效果以及显示的位置等等: 这是Gi ...
- 软工网络15个人作业4-alpha阶段个人总结(201521123059 叶文柠)
一.个人总结 (1) 类别 具体技能和面试问题 现在回答 毕业找工作时 语言 最拿手的计算机语言之一,代码量多少? 感觉自己没有最拿手的语言,而且拿手的在计算机网络这方面的,所以在软件变成这方面的代码 ...
- [CLR via C#]引用类型和值类型
一.引用类型与值类型的区别 CLR支持两种类型:引用类型和值类型.引用类型总是从托管堆上分配的,C#的new操作符会返回对象的内存地址.使用引用类型时,必须注意到一些性能问题. 1)内存必须从托管堆上 ...