博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 开发中 Serializable 和 Parcelable 的使用和区别
阅读量:6238 次
发布时间:2019-06-22

本文共 3403 字,大约阅读时间需要 11 分钟。

1、 序列化的目的

(1)永久的保存对象,将对象数据保存在文件、磁盘或者数据库中 。

(2)通过序列化操作将对象数据在网络上进行传输 。

(3)将对象序列化之后在进程间进行传输 。

(4)在安卓中使用 Intent 进行传输时候,数据类型较为复杂的需要进行序列化操作 。

2、 Serializable

public class Mybox4 implements Serializable {    private String name;    private String age;    public Mybox4(String name, String age) {        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getAge() {        return age;    }    public void setAge(String age) {        this.age = age;    }    @Override    public String toString() {        return "Mybox4{" +                "name='" + name + '\'' +                ", age='" + age + '\'' +                '}';    }}复制代码

通过上述代码可以看出,使用 Serializable 的时候比较简单,只需要实现 Serializable 接口即可,这样就告诉程序这个类是可以被序列化的。

下面看下如何实现对象的序列化与反序列化:

Mybox4 mybox4 = new Mybox4("keven", "27");File file = new File("box.out");//序列化FileOutputStream outputStream = new FileOutputStream(file);ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);objectOutputStream.writeObject(mybox4);objectOutputStream.close();//反序列化FileInputStream fileInputStream = new FileInputStream(file);ObjectInputStream inputStream = new ObjectInputStream(fileInputStream);Mybox4 o = (Mybox4) inputStream.readObject();inputStream.close();System.out.println(o.toString());复制代码

输出为:

Mybox4{name='keven', age='27'}复制代码

3、 Parcelbale

Parcelable 是 Android 特有的序列化方式,他的实现相对 Serialiable 来说更加复杂一点。

Parcelable 内部包装了可序列化的数据,序列化功能由 writeToParcel 方法完成,反序列化由 CREATOR 完成。

public class Mybox4Par implements Parcelable {    private String name;    private String age;    public Mybox4Par(String name, String age) {        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getAge() {        return age;    }    public void setAge(String age) {        this.age = age;    }    @Override    public String toString() {        return "Mybox4Par{" +                "name='" + name + '\'' +                ", age='" + age + '\'' +                '}';    }    @Override    public int describeContents() {        return 0;    }    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeString(name);        dest.writeString(age);    }    public static final Parcelable.Creator
CREATOR=new Creator
() { @Override public Mybox4Par createFromParcel(Parcel source) { return new Mybox4Par(source); } @Override public Mybox4Par[] newArray(int size) { return new Mybox4Par[size]; } }; public Mybox4Par(Parcel in){ name=in.readString(); age=in.readString(); }}复制代码

上述就是实现了 Parcelable 接口,并重写方法,我们看下如何使用:

//第一个ActivityMybox4Par mybox4Par=new Mybox4Par("keven","25");Bundle bundle=new Bundle();Intent intent=new Intent(this,MyViewActivity.class);bundle.putParcelable("box",mybox4Par);intent.putExtras(bundle);startActivity(intent);复制代码
//第二个ActivityIntent intent=getIntent();Bundle extras = intent.getExtras();Mybox4Par box = extras.getParcelable("box");Log.e("box",box.toString());复制代码

4、 两者选择

Serializable 使用简单但是开销很大,序列化与反序列化需要大量的 I/O 操作,一般用于将对象序列化到存储设备中,或序列化后通过网络传输;

Parcelable 使用稍微麻烦点,但是效率高,主要用在内存序列化上。

转载于:https://juejin.im/post/5cf0f7886fb9a07ed84228c5

你可能感兴趣的文章
Java 开源博客 Solo 1.4.0 发布 - 简化
查看>>
Oracle巡检
查看>>
【转载】胜者树
查看>>
查看mysql数据库存放的路径|Linux下查看MySQL的安装路径
查看>>
selenium+testNG+Ant
查看>>
1024程序员节,你屯书了吗?(内含福利)
查看>>
移动端JS 触摸事件基础
查看>>
Flex拖动原来如此简单
查看>>
温故而知新:什么是wcf
查看>>
centos语言设置
查看>>
php安装
查看>>
Fragment在getUserVisibleHint时进行加载数据的问题记录
查看>>
使用线程池模拟处理耗时任务,通过websocket提高用户体验
查看>>
Java 内部类种类及使用解析
查看>>
Axure产品原型设计工具
查看>>
spice在桌面虚拟化中的应用系列之三(USB映射实现,SSL加密,密码认证,多客户端支持)...
查看>>
Loading project 91606170 of 1: Project FooBar 问题如何解决?
查看>>
C# yeild使用
查看>>
MapReduce-Hadoop分布式计算模型
查看>>
StrokePlus
查看>>