Serializable与Parcelable
来源:互联网 发布:Java加密解密 面试 编辑:程序博客网 时间:2024/05/29 03:14
1、引言
Intent作为四大组件的中间桥梁,在安卓开发中扮演着不可或缺的角色。在往常的开发过程中,传递的多为基本数据类型,类似int,String等。而作为复杂数据类型则无法像基本数据类型一般简单的进行传递,它需要一个序列化过程。
2、序列化两种方式
序列化的方式有2种:Serializable和Parcelable。那这两种序列化方式有什么区别呢?
2.1 作用
Serializable由Java提供,它的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。它使用起来简单,但是需要做大量的I/O操作,适用于网络传输本地存储。
而Parcelable为Android特有,它的设计初衷就是因为Serializable效率过慢,为了在程序内不同组间以件及不同Android程序间(AIDL)高效的传输数据而设计,主要用于内存序列化。这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。
2.2 选择
从2.1中可看出,单从效率上看,Parcelable效率较高,内存开销小,故而在内存间数据传输推荐使用parcelable,例如Activity之间的数据传递,而Serializable在数据持久化上(如本地保存、网络通信等)则表现出Parcelable无法替代的作用。更主要的是,不同的Android版本的Parcelable可能会不一样,所以通常在安卓开发上是不建议使用Parcelable序列化的。
2.3 代码实现
2.3.1 Serializable序列化演示
Serializable的序列化过程较为简单,只要实现Serializable接口即可。
演示代码如下:
Book实体类:
public class Book implements Serializable { private static final long serialVersionUID = 1700400696309660612L; private int price;// 价格 private String name;// 书名 private String author;// 作者 //省略了get/set方法}
MainActivity类传递过程:
Book book=new Book();book.setPrice(100);book.setName("《边城》");book.setAuthor("沈从文");Intent intent=new Intent(MainActivity.this,SecondActivity.class);intent.putExtra("Book", book);MainActivity.this.startActivity(intent);
SecondActivity类获取:
Intent intent=getIntent();book=(Book) intent.getSerializableExtra("Book");
2.3.2 Parcelable序列化演示
Parcelable的序列化需要实现Parcelable接口,同时重写describeContents()和writeToParcel()方法。
先上示例代码:
Watch实体类:
public class Watch implements Parcelable { private String name;// 手表名 private int price;// 价格 private String origin;// 原产地 /** * 无参构造,提供给外部实例化使用 */ public Watch() {} /** * 有参构造,仅提供createFromParcel()使用 */ private Watch(Parcel in) { name = in.readString(); price = in.readInt(); origin = in.readString(); } @Override public int describeContents() { return 0; } // 将对象中的属性保存至目标对象dest中 @Override public void writeToParcel(Parcel dest, int arg1) { dest.writeString(name); dest.writeInt(price); dest.writeString(origin); } public static final Parcelable.Creator<Watch> CREATOR = new Parcelable.Creator<Watch>() { // 重写createFromParcel方法,创建并返回一个获得了数据的user对象 @Override public Watch createFromParcel(Parcel source) { return new Watch(source); } @Override public Watch[] newArray(int size) { return new Watch[size]; } }; //省略get/set方法}
MainActivity类传递过程:
Watch watch=new Watch();watch.setName("Apple");watch.setOrigin("USA");watch.setPrice(5400);Intent intent=new Intent(MainActivity.this,SecondActivity.class);intent.putExtra("Watch", watch);MainActivity.this.startActivity(intent);
SecondActivity类获取:
Intent intent=getIntent();watch=intent.getParcelableExtra("Watch");
从上面可以看出,Parcelable的序列化过程较Serializable复杂,它不像前者一般把整个对象进行序列化,而是将Watch对象中的各个属性进行序列化,而后通过一个CREATOR对象再组装成一个Watch对象。
3、注意点
- Parcelable序列化的过程中,writeToParcel()和createFromParcel()的属性设置顺序和数据类型要一致;
- Serializable序列化不保存静态变量(原因:序列化保存的是对象的状态,静态变量属于类的状态),可以使用Transient关键字对部分字段不进行序列化。
- Serializable使用IO读写存储在硬盘上,而Parcelable是直接在内存中读写。
- Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
- Parcelable与Serializable
- Parcelable与Serializable
- Parcelable与Serializable
- Serializable与Parcelable
- 浅谈parcelable与serializable
- Android Serializable与Parcelable
- Parcelable与Serializable区别
- Serializable与Parcelable
- Parcelable与Serializable区别
- Android - Serializable 与 Parcelable
- Serializable与Parcelable
- Serializable与Parcelable区别
- Serializable与Parcelable对比
- Serializable与Parcelable
- Serializable与Parcelable
- Serializable与Parcelable区别
- Parcelable与Serializable
- 浅谈Serializable与Parcelable
- 注释驱动的 Spring cache 缓存介绍
- c:forEach
- 【解决方案】Android中Log太多太长打印不全的问题
- java内存溢出和内存泄露
- 三十行代码实现一个简单计算器
- Serializable与Parcelable
- Android 5.0以上版本禁止锁屏与休眠
- 字符编码常识及问题解析
- jsonp跨域请求
- 含有注释的SQL生成器升级
- Socket通信实例
- Spring Cache
- does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), o
- R 语言绘图条形产生随机颜色