Android Parcelable vs Serializable
序列化
在Android中。对象在实现序列化之前是无法直接作为Intent參数在Activity之间传递的。
Android中对象序列化能够通过实现Serializable接口或者实现Parcelable接口。
接下来,我会介绍一下实现这两个接口的方法以及怎样在这两者之间进行选择。
Serializable
Serializable是一个标记接口,意味着它没有须要实现的方法。
由于对象再实现Serializable接口的时候,仅仅须要简单的implements就可以。
演示样例代码例如以下:
package com.example.photocrop.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class PersonSerializable implements Serializable {
private static final long serialVersionUID = -1535959029658501338L;
private String name;
private String sex;
private int age;
private List<String> skills = new ArrayList<String>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<String> getSkills() {
return skills;
}
public void setSkills(List<String> skills) {
this.skills = skills;
}
}
在Activity-1中传递PersonSerializable的代码例如以下:
private PersonSerializable generatePerson() {
PersonSerializable ps = new PersonSerializable();
ps.setAge(27);
ps.setName("wangzhengyi");
ps.setSex("boy");
ps.setSkills(new ArrayList<String>(Arrays.asList("c", "c++", "java", "php")));
return ps;
}
private void startActivity2() {
PersonSerializable ps = generatePerson();
Intent intent = new Intent(this, Activity2.class);
intent.putExtra("person", ps);
startActivity(intent);
}
在activity-2中接收PersonSerializable对象:
Intent intent = getIntent();
PersonSerializable ps = (PersonSerializable)intent.getSerializableExtra("person");
Log.e("wangzhengyi", "person name :" + ps.getName());
Log.e("wangzhengyi", "persion age :" + ps.getAge());
Parcelable
实现Parcelable接口主要须要例如以下几个步骤:
- 实现describeContents方法。
内容接口描写叙述,默认返回0就可以。
- 实现writeToParcel方法。传递数据到Parcel容器中。
- 创建一个Parcelable.Creator接口的实例,用于读取Parcel容器中的数据。
演示样例代码例如以下:
package com.example.photocrop.model;
import java.util.ArrayList;
import java.util.List;
import android.os.Parcel;
import android.os.Parcelable;
public class PersonParcelable implements Parcelable{
private String name;
private String sex;
private int age;
private List<String> skills = new ArrayList<String>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<String> getSkills() {
return skills;
}
public void setSkills(List<String> skills) {
this.skills = skills;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(getName());
dest.writeString(getSex());
dest.writeInt(getAge());
dest.writeList(getSkills());
}
public void readFromParcel(Parcel source) {
setName(source.readString());
setSex(source.readString());
setAge(source.readInt());
source.readList(skills, List.class.getClassLoader());
}
public static final Parcelable.Creator<PersonParcelable> CREATOR = new Parcelable.Creator<PersonParcelable>() {
@Override
public PersonParcelable createFromParcel(Parcel source) {
// 从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。
PersonParcelable pp = new PersonParcelable();
pp.readFromParcel(source);
return pp;
}
@Override
public PersonParcelable[] newArray(int size) {
// 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])就可以。
方法是供外部类反序列化本类数组使用。
return new PersonParcelable[size];
}
};
}
在activity-1中传递PersonParcelable对象:
private PersonParcelable generatePerson() {
PersonParcelable pp = new PersonParcelable();
ps.setAge(27);
ps.setName("wangzhengyi");
ps.setSex("boy");
ps.setSkills(new ArrayList<String>(Arrays.asList("c", "c++", "java", "php")));
return pp;
}
private void startActivity2() {
PersonParcelable pp = generatePerson();
Intent intent = new Intent(this, Activity2.class);
intent.putExtra("person", ps);
startActivity(intent);
}
在activity-2中接收PersonParcelable对象:
Intent intent = getIntent();
PersonParcelable pp = (PersonParcelable) intent.getParcelableExtra("person");
Log.e("wangzhengyi", "person name :" + pp.getName());
Log.e("wangzhengyi", "persion age :" + pp.getAge());
for (String skill : pp.getSkills()) {
Log.e("wangzhengyi", "skill:" + skill);
}
差别
基本的差别例如以下:
- Serializable实现简单,不须要不论什么额外的序列化操作。
而Parcelable实现较为复杂,有特定的接口和对象句柄须要实现。
- Serializable在序列化的时候会产生大量的暂时变量。从而引起频繁的GC,而相比之下Parcelable的性能更高(号称10倍优于Serializable)。所以当在使用内存时(如:序列化对象在网络中传递对象或序列化在进程间传递对象),更推荐使用Parcelable接口。
- Parcelable有个明显的缺点:不能使用在要将数据存储在磁盘上的情况(如:永久性保存对象,保存对象的字节序列到本地文件里)。由于Parcel本质上为了更好的实现对象在IPC间传递。并非一个通用的序列化机制,当改变不论什么Parcel中数据的底层实现都可能导致之前的数据不可读取。所以此时还是建议使用Serializable 。
Android Parcelable vs Serializable的更多相关文章
- Android Parcelable和Serializable的区别,androidparcelable
本文主要介绍Parcelable和Serializable的作用.效率.区别及选择,关于Serializable的介绍见Java 序列化的高级认识. 1.作用 Serializable的作用是为了保存 ...
- Android Parcelable和Serializable的区别
本文主要介绍Parcelable和Serializable的作用.效率.区别及选择,关于Serializable的介绍见Java 序列化的高级认识. 1.作用 Serializable的作用是为了保存 ...
- [转]Android Parcelable和Serializable的区别
本文主要介绍Parcelable和Serializable的作用.效率.区别及选择,关于Serializable的介绍见Java 序列化的高级认识. 1.作用 Serializable的作用是为了保存 ...
- Android序列化之Serializable和Parcelable
PS:还有几天就开学了.先来一发. 学习内容: 1.序列化的目的 2.Android中序列化的两种方式 3.Parcelable与Serializable的性能比较 4.Android中如何使用Par ...
- Android系统中Parcelable和Serializable的区别
转载:https://greenrobot.me/devpost/android-parcelable-serializable/ 进行Android开发的时候,我们都知道不能将对象的引用传给Acti ...
- android Activity之间数据传递 Parcelable和Serializable接口的使用
Activity之间传数据时,为了避免麻烦,往往会将一些值封装成对象,然后将整个对象传递过去.传对象的时候有两种情况,一种是实现Parcelable接口,一种是实现Serializable接口.0.解 ...
- 【安卓开发】Android系统中Parcelable和Serializable的区别
http://greenrobot.me/devpost/android-parcelable-serializable/ 进行Android开发的时候,我们都知道不能将对象的引用传给Activiti ...
- Android中Parcelable和Serializable接口用法
1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel. ...
- Android中Parcelable与Serializable接口用法
转自: Android中Parcelable接口用法 1. Parcelable接口 Interface for classes whose instances can be written to a ...
随机推荐
- Linux体验之旅(一)——制作U启,安装rhel-server-6.3
U启制作: 双击UltraISO: 点击文件→打开: 选择rhel-server6.3 点击启动→选择写入硬盘映像 最后选择格式化优盘→写入→完毕 注意:启动盘制作完毕后一定记得将rhel-serve ...
- 例说Linux内核链表(三)
经常使用的linux内核双向链表API介绍 linux link list结构图例如以下: 内核双向链表的在linux内核中的位置:/include/linux/list.h 使用双向链表的过程,主要 ...
- 2014.04.16,读书,读书笔记-《Matlab R2014a完全自学一本通》-第17章 图形用户界面
界面对象分三类: 用户控件对象(uicontrol) 下拉式菜单对象(uimenu) 内容式菜单对象(uicontextmenu) 创建用户界面: 1.命令行方式 采用uicontrol来创建控件对象 ...
- UVA 11728 - Alternate Task 数学
Little Hasan loves to play number games with his friends. One day they were playing a game whereone ...
- [AHOI 2009] 同类分布
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1799 [算法] 数位DP [代码] #include<bits/stdc++. ...
- 院校-德国:亚琛工业大学(RWTH)
ylbtech-院校-德国:亚琛工业大学(RWTH) 1.返回顶部 1. 亚琛工业大学(RWTH)成立于1870年,是德国著名理工类大学之一,也是世界顶尖理工类大学之一 ,长久以来被誉为“欧洲的麻省理 ...
- 将字符串序列化Object格式
using Newtonsoft.Json; 首先引用 Newtonsoft.Json; 定义一个字符串 string str = "[{'ID':8.0,'PAGEID':201.0,' ...
- B/S发布到服务器
域名准备好了?准备好就开始跟我操作吧: 1:预先在项目的同目录下新建文件夹 Public 2:找到项目解决方案重新生成 3:项目右击 发布 到 Public 4: 登入服务器 打开 Internet管 ...
- 读书笔记之《HTML5 与 CSS3 基础教程》
1· 读前预期 考虑到对于 Web 开发零基础,凡涉足一件未知的任务,最好先理清任务的逻辑结构,然后有目的地逐步学习.为实现我们的需求和设计,必须要学习前端.后端.服务器等一系列暂时陌生的知识,在此, ...
- XP访问WIN10共享打印机提示错误:操作无法完成,拒绝访问
XP系统添加打印机--连接到此计算机的本地打印机(取消自动检测)--创建新端口(LOCAL port)----输入端口名\\计算机名\打印机名.(例如:\\adubei\\HP lasjet 1020 ...