1.概念:
序列化
将数据结构或对象转换成二进制串的过程。
反序列化
将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。
2.作用:
主要用于网络传输,数据的持久化
3.方式:
1.java中的Serializable
Serializable是 Java 提供的序列化接口,它是一个空接口Serializable 用来标识当前类可以被 ObjectOutputStream 序列化,以及被 ObjectInputStream 反序列化。
注意点:
1)为什么需要使用serialVersionUID?
serialVersionUID 用来表明类的不同版本间的兼容性。如果你修改了此类, 要修改此值。否则以前用老版本的类序列化的类恢复时会报错: InvalidClassException,如果添加此字段,版本不变,在成员变化时依然可以反序列化之前序列化的数据
2)部分字段不想被序列化怎么办?
用transient关键字标记的成员变量不参与序列化,可以在存储数据时有效过滤掉敏感数据。
3)子类实现Serializable,而父类未实现的情况
父类成员变量不会被序列化。
4)父类实现子类能否使用序列化,如果不想子类能序列化怎么处理?
重新读写方法,抛出异常
5)静态变量会不会被序列化?
静态成员变量属于类不属于对象,所以不会参与序列化(对象序列化保存的是对象的“状态”,也就是它的成员变量,因此序列化不会关注静态变量)
2.android的Parcelable
需要实现三个方法:
描述当前Parcelable实例的对象类型
public
int
describeContents
(){}
写方法
public
void
writeToParcel
(
Parcel dest
,
int
flags
){}
读方法
Parcelable
.
Creator
<
bean
>
CREATOR
=
new
Parcelable
.
Creator
<
bean
>
(){}
3.其他方式JSON、XML&SOAP、Protobuf
4.性能比较总结描述
首先Parcelable
的性能要强于
Serializable的原因我需要简单的阐述一下在内存的使用中
,前者在性能方面要强于后者后者在序列化操作的时候会产生大量的临时变量
,(
原因是使用了反射机制
)
从而导致
GC的频繁调用,因此在性能上会稍微逊色Parcelable
是以
Ibinder
作为信息载体的
.
在内存上的开销比较小
,因此在内存之间进行数据传递的时候
,Android
推荐使用
Parcelable,
既然是内存方面比价有优势
,
那么自然就要优先选择.在读写数据的时候
,Parcelable
是在内存中直接进行读写
,
而
Serializable
是通过使用
IO流的形式将数据读写入在硬盘上.但是:虽然
Parcelable
的性能要强于
Serializable,
但是仍然有特殊的情况需要使用
Serializable,而不去使用
Parcelable,
因为
Parcelable
无法将数据进行持久化
,
因此在将数据保存在磁盘的时候
,仍然需要使用后者
,
因为前者无法很好的将数据进行持久化
.(
原因是在不同的
Android
版本当中,Parcelable可能会不同
,
因此数据的持久化方面仍然是使用
Serializable)