分享

Serializable & Parcelable接口总结和区别

 东西VS南北 2017-11-16
序列化产生的原因:

在java中经常需要将object从客户端和服务端(两端)来回传递。这时候就需要一种可以在两端

传输数据的协议,序列化机制就是为了解决这个问题而产生。

序列化:

表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可

以存储到本地。

Serializable(Java自带): 


Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象

可以在网络上进行传输,也可以存储到本地。

Parcelable(android 专用): 
除了Serializable之外,使用Parcelable也可以实现相同的效果, 

不过不同于将对象进行序列化,Parcelable方式的实现原理是将一个完整的对象进行分解,

而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了。

实现序列化的作用

1)永久性保存对象,保存对象的字节序列到本地文件中;

2)通过序列化对象在网络中传递对象;

3)通过序列化在进程间传递对象。

选择序列化方法的原则

1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。

2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。

3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable 。

Serializable与Parcelable区别

Serializable使用IO读写存储在硬盘上,而Parcelable是直接在内存中读写,很明显内存的读

写速度通常大于IO读写,所以在Android中通常优先选择Parcelable。

Serializable实现起来简单 serializable的迷人之处在于你只需要对某个类以及它的属性实现S

erializable 接口即可。Serializable 接口是一种标识接口(marker interface),这意味着无需实

现方法,Java便会对这个对象进行高效的序列化操作。

这种方法的缺点是使用了反射,序列化的过程较慢。这种机制会在序列化的时候创建许多的临

时对象,容易触发垃圾回收。

在Android中实现Parcelable接口序列化,以下是一个实现的步骤和举例:
1. 实现Parcelable接口

2. 添加实体属性

3. 覆写writeToParcel(Parcel dest, int flags)方法,指定写入Parcel类的数据。

4. 创建Parcelable.Creator静态对象,有两个方法createFromParcel(Parcel in)与newArray(int size),

前者指定如何从Parcel中读取出数据对象,后者创建一个数组

5. 覆写describeContents方法,默认返回0。

public class User implements Parcelable {
private String name;
private String IdCard;
private int age;
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel in) {
User user = new User();
user.age = in.readInt();
user.IdCard = in.readString();
user.name = in.readString();
return new User();
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(name);
parcel.writeString(IdCard);
parcel.writeInt(age);
}
}
效率上 parcelable 快
代码上 serializable 简单

序列化与反序列化uuid问题:(serializable

uuid相当于版本号 反编译的时候会找对应的版本号进行反编译

手动添加uuid,反序列化时即使对象类变化也不会报错。

不手动添加uuid,会自动为其添加uuid,对象类改变,反序列化的时候就会报错。原因是自动添加的uuid来自于计算对象类的成员,类成员发生变化,反序列化的时候uuid与修改后的对象类不符将会报错

Transient:(关键字)

为变量添加该关键字,该变量将不会被序列化


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多