序列化产生的原因: 在java中经常需要将object从客户端和服务端(两端)来回传递。这时候就需要一种可以在两端 传输数据的协议,序列化机制就是为了解决这个问题而产生。 序列化: 表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可 以存储到本地。 Serializable(Java自带):
可以在网络上进行传输,也可以存储到本地。 Parcelable(android 专用): 不过不同于将对象进行序列化,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 现方法,Java便会对这个对象进行高效的序列化操作。 这种方法的缺点是使用了反射,序列化的过程较慢。这种机制会在序列化的时候创建许多的临 时对象,容易触发垃圾回收。 在Android中实现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 { 效率上 parcelable 快 代码上 serializable 简单 序列化与反序列化uuid问题:(serializable) uuid相当于版本号 反编译的时候会找对应的版本号进行反编译 手动添加uuid,反序列化时即使对象类变化也不会报错。 不手动添加uuid,会自动为其添加uuid,对象类改变,反序列化的时候就会报错。原因是自动添加的uuid来自于计算对象类的成员,类成员发生变化,反序列化的时候uuid与修改后的对象类不符将会报错 Transient:(关键字) 为变量添加该关键字,该变量将不会被序列化 |
|