序列化

在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接口主要须要例如以下几个步骤:

  1. 实现describeContents方法。

    内容接口描写叙述,默认返回0就可以。

  2. 实现writeToParcel方法。传递数据到Parcel容器中。
  3. 创建一个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);
}

差别

基本的差别例如以下:

  1. Serializable实现简单,不须要不论什么额外的序列化操作。

    而Parcelable实现较为复杂,有特定的接口和对象句柄须要实现。

  2. Serializable在序列化的时候会产生大量的暂时变量。从而引起频繁的GC,而相比之下Parcelable的性能更高(号称10倍优于Serializable)。所以当在使用内存时(如:序列化对象在网络中传递对象或序列化在进程间传递对象),更推荐使用Parcelable接口。
  3. Parcelable有个明显的缺点:不能使用在要将数据存储在磁盘上的情况(如:永久性保存对象,保存对象的字节序列到本地文件里)。由于Parcel本质上为了更好的实现对象在IPC间传递。并非一个通用的序列化机制,当改变不论什么Parcel中数据的底层实现都可能导致之前的数据不可读取。所以此时还是建议使用Serializable 。

Android Parcelable vs Serializable的更多相关文章

  1. Android Parcelable和Serializable的区别,androidparcelable

    本文主要介绍Parcelable和Serializable的作用.效率.区别及选择,关于Serializable的介绍见Java 序列化的高级认识. 1.作用 Serializable的作用是为了保存 ...

  2. Android Parcelable和Serializable的区别

    本文主要介绍Parcelable和Serializable的作用.效率.区别及选择,关于Serializable的介绍见Java 序列化的高级认识. 1.作用 Serializable的作用是为了保存 ...

  3. [转]Android Parcelable和Serializable的区别

    本文主要介绍Parcelable和Serializable的作用.效率.区别及选择,关于Serializable的介绍见Java 序列化的高级认识. 1.作用 Serializable的作用是为了保存 ...

  4. Android序列化之Serializable和Parcelable

    PS:还有几天就开学了.先来一发. 学习内容: 1.序列化的目的 2.Android中序列化的两种方式 3.Parcelable与Serializable的性能比较 4.Android中如何使用Par ...

  5. Android系统中Parcelable和Serializable的区别

    转载:https://greenrobot.me/devpost/android-parcelable-serializable/ 进行Android开发的时候,我们都知道不能将对象的引用传给Acti ...

  6. android Activity之间数据传递 Parcelable和Serializable接口的使用

    Activity之间传数据时,为了避免麻烦,往往会将一些值封装成对象,然后将整个对象传递过去.传对象的时候有两种情况,一种是实现Parcelable接口,一种是实现Serializable接口.0.解 ...

  7. 【安卓开发】Android系统中Parcelable和Serializable的区别

    http://greenrobot.me/devpost/android-parcelable-serializable/ 进行Android开发的时候,我们都知道不能将对象的引用传给Activiti ...

  8. Android中Parcelable和Serializable接口用法

    1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel. ...

  9. Android中Parcelable与Serializable接口用法

    转自: Android中Parcelable接口用法 1. Parcelable接口 Interface for classes whose instances can be written to a ...

随机推荐

  1. ES 内存使用和GC指标——主节点每30秒会去检查其他节点的状态,如果任何节点的垃圾回收时间超过30秒(Garbage collection duration),则会导致主节点任务该节点脱离集群。

    摘录自:http://blog.csdn.net/yangwenbo214/article/details/74000458 内存使用和GC指标 在运行Elasticsearch时,内存是您要密切监控 ...

  2. C# 遍历文件夹及子目录下所有图片.

    要求:取指定目录下面的所有图片,以表格的型式展示并显示该图片的相对路径. 服务端代码: public partial class ViewIcon : System.Web.UI.Page { JAr ...

  3. 【刷题笔记】LeetCode 222. Count Complete Tree Nodes

    题意 给一棵 complete binary tree,数数看一共有多少个结点.做题链接 直观做法:递归 var countNodes = function(root) { if(root===nul ...

  4. BZOJ 4129 树上带修莫队+线段树

    思路: 可以先做做BZOJ3585 是序列上的mex 考虑莫队的转移 如果当前数字出现过 线段树上把它置成1 对于询问 二分ans 线段树上查 0到ans的和 是不是ans+1 本题就是把它搞到了序列 ...

  5. Rsync 服务器搭建

    Rsync简介 rsync 是一个 Unix 系统下的文件同步和传输工具. 它具备以下特性: 1. 能更新整个目录和树和文件系统 2. 有选择性的保持符号链链.硬链接.文件属于.权限.设备以及时间 等 ...

  6. SQL Server 从字符串中提取中文、英文、数字

    --[提取中文] IF OBJECT_ID('dbo.fun_getCN') IS NOT NULL DROP FUNCTION dbo.fun_getCN GO create function db ...

  7. function——函数声明头的提升和预解析

    函数: 即function语句的集合,就是将多个语句封装到一起: 函数的执行要会自己遍历,遇见函数 a():执行语句,就要移交控制权,函数执行完毕之后,控制权又移交回来了! 函数的参数要罗列在func ...

  8. Function 和 eval 知识点总结

    1 Function 1.1 函数的创建方式 1 函数声明 2 函数表达式 3 new Function // 1 function foo() {} // 2 var foo = function( ...

  9. 脚本_求和100以内的正整数.sh

    #!bin/bash#功能:求和100以内的正整数#作者:liusingbon#seq 100 可以快速自动生成 100 个整数sum=0for i in $(seq 100)do    sum=$[ ...

  10. BZOJ 2150 部落战争 (二分图匹配)

    题目大意:给你一个n*m的棋盘,有一些坏点不能走,你有很多军队,每支军队可以像象棋里的马一样移动,不过马是1*2移动的,而军队是r*c移动的,军队只能从上往下移动,如果一个点已经被一直军队经过,那么其 ...