Android中两种序列化方式的比较Serializable和Parcelable
来源:互联网 发布:越前南次郎的实力数据 编辑:程序博客网 时间:2024/06/10 00:19
Serializable和Parcelable接口可以完成对象的序列化过程,当我们需要通过Intent和Binder传输数据时就需要使用者两种序列化方式。还有,我们需要对象持久化到存储设备或者通过网络传输给其他客户端,这个使用也需要使用Serializale来完成对象的序列化。在Android应用开发中,这两种方式都很常见,但两者方式并不相同。
1.Serializable接口
Serializable接口是Java提供的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化操作。使用Serializable来实现的对象的序列化相当简单,只需要在类的生命中指定一个类似相面的标识即可自动实现默认的序列化过程。
private static final long serialVersionUID=871238749032
完整的对象序列化代码示例如下:
//Modelpublic class User implements Serializable{ private static final long serialVersionUID=871238749032; public int userId; public String userName; public String password;}//序列化到本地User user=new User(0,"wcl_android@163.com","123456");ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("user.obj"));out.writeObject(user);out.close;//反序列化ObjectInputStream in=new ObjectInputStream(new FileInputStream("user.obj"));User user=(User)in.readObject();in.close();
这种方式是Java提供的一种序列化方式,过程非常简单,甚至有些开发人员都不需要声明serialVersionUID也可以完成这个过程,但serialVersionUID到底需不需要指定呢?
需要!
Java API既然提供了这个serialVersionUID,那么它必定是有用的。这个serialVersionUID是用来辅助序列化和反序列化过程的,原则上序列化后的数据中的serialVersionUID只有和当前类的serialVersionUID相同才能够正常地被反序列化。
serialVersionUID的详细工作过程是这样的:序列化的时候系统会把当前类的serialVersionUID写入序列化的二进制文件中,当反序列化的时候系统会检测文件中的serialVersionUID是否和当前类的serialVersionUID一致,如果一致就说明序列化的类的版本和当前类的版本是相同的,这个时候可以成功反序列化;否则说明当前类和反序列化的类相比发生了某些变化,比如成员变量的数量、类型发生了变化,这个时候是无法正常反序列化的。
一般来说,我们应该手动指定serialVersionUID的值,比如1L,也可以让IDE根据当前类的结构自动去生成它的hash值,这样序列化和反序列化时两者的serialVersionUID是相同的,因此可以正常进行反序列化操作。如果不手动指定serialVersionUID的值
反序列化时当前类有些改变,比如增加或者删除了某些成员变量,那么系统就会重新计算当前类的hash值并把它赋值给serialVersionUID,这个时候当前类的serialVersionUID就和反序列化数据中的serialVersionUID不一致,就会造成反序列化失败的结果。所以,手动指定serialVersionUID可以在很大程度上避免反序列化过程的失败。
比如当版本升级后,我们可能删除了某个成员变量也可能增加了一些新的成员变量,这个时候我们的反序列化过程依然能够成功,程序仍然能够最大限度地回复数据;相反,如果不指定serialVersionUID的话,程序会发生Crash。
当然,我们还需要考虑一种情况,如果类结构发生了非城规改变,比如修改了类名,修改了成员变量的类型,这个时候尽管serialVersionUID验证通过了,但是反序列化过程仍然会失败,因为类的结构有了毁灭性的改变,根本无法从老版本的数据中还原出一个新的类结构的对象。
对于使用序列化还有两点需要注意:
1.静态成员变量属于类不属于对象,所以不参与序列化过程
2.用transient关键字标记的成员变量不参与序列化过程
2.Parcelable接口
Parcelable接口是Android SDK提供的一种专门用于Android应用中对象的序列化和反序列化的方式,相比于Seriablizable具有更好的性能。实现Parcelable接口的对象就可以实现序列化并可以通过Intent和Binder传递。
下面是一个完成的实现了Parcelable接口的类
public class User implements Parcelable{ public int userId; public String userName; public String password; public Book book; public User(int userId,String userName,String password,Book book){ this.userId=userId; this.userName=userName; this.password=password; this.book=book; } public int describeContents(){ //几乎所有情况都返回0,仅在当前对象中存在文件描述符时返回1 return 0; } public void writeToParcel(Parcel out,int flags){ out.writeInt(userId); out.writeString(userName); out.writeString(password); out.writeParcelable(book,0); } public static final Parcelable.Creator<User> CREATOR=new Parcelable.Creator<User>(){ public User createFromParcel(Parcel in){ return new User(in); } public User[] newArray(int size){ return new User[size]; } } private User(Parcel in){ userId=in.readInt(); userName=in.readString(); password=in.readString(); book=in.readParcelable(Thread.currentThread().getContextClassLoader()); }}
看起来比Serializable方式复杂太多。我们使用表格把Parcelable方式的相关方法进行说明
既然Parcelable和Serializable都可以实现序列化并且可以用于Intent间的数据传递,那么两者有什么区别呢?
- Android中两种序列化方式的比较Serializable和Parcelable
- Android中两种序列化方式的比较Serializable和Parcelable
- Android中两种序列化方式的比较Serializable和Parcelable
- 对象序列化的两种方式 Serializable和Parcelable
- android序列化 Parcelable和Serializable接口
- Android序列化:Serializable和Parcelable详解
- Android 序列化 Parcelable和Serializable 浅谈
- Android序列化Serializable和Parcelable区别
- Android序列化parcelable和 serializable分析
- Android序列化:Serializable和Parcelable
- Android中的Serializable和Parcelable序列化
- Android序列化-Serializable和Parcelable
- Android中的序列化Serializable和Parcelable
- Android序列化问题-Parcelable和Serializable
- Android对象序列化:Serializable和Parcelable
- Android序列化:Serializable和Parcelable
- Android 序列化之Serializable和Parcelable
- Android 实现序列化:Parcelable和Serializable接口的用法
- iOS开发修改UITextField的placeholder的颜色字体大小等
- 【PHP-排序算法】快速排序、堆排序算法时间复杂度比较
- 《组合数学》第二章-排列与组合
- 作业 5
- JDBC中的Statement和PreparedStatement的区别
- Android中两种序列化方式的比较Serializable和Parcelable
- 编程算法
- js 工具库
- python机器学习实战4:Logistic回归
- 如何入门NLP
- 编译Linux-4.9.11内核时遇到:“error : openssl/bio.h :No such file or folder”
- Codeforces Round #408 (Div. 2) E
- 记录一下python中遇到的问题
- 简单socket通信